Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug - Add DISCOVERY_SHOW_PROGRESS=true - Temporary changes for debugging InitializerProcessor fixes on production
This commit is contained in:
@@ -0,0 +1,610 @@
|
||||
# Admin Design System
|
||||
|
||||
> Comprehensive design system for administrative interfaces with modern UI patterns, accessibility standards, and developer efficiency.
|
||||
|
||||
## 🎯 Design Principles
|
||||
|
||||
### User Experience
|
||||
- **Clarity First** - Information hierarchy and visual clarity over decoration
|
||||
- **Efficiency** - Minimize cognitive load and interaction friction
|
||||
- **Consistency** - Predictable patterns and behaviors across all interfaces
|
||||
- **Accessibility** - WCAG 2.1 AA compliance and inclusive design
|
||||
|
||||
### Technical Excellence
|
||||
- **Performance** - Fast load times and smooth interactions
|
||||
- **Maintainability** - Modular, reusable components
|
||||
- **Scalability** - Adaptable to growing feature requirements
|
||||
- **Developer Experience** - Clear documentation and easy implementation
|
||||
|
||||
## 🎨 Visual Language
|
||||
|
||||
### Color System
|
||||
|
||||
```css
|
||||
/* Primary Admin Palette */
|
||||
--admin-primary: #6366f1; /* Indigo - Primary actions */
|
||||
--admin-primary-hover: #5855eb; /* Hover states */
|
||||
--admin-primary-active: #4f46e5; /* Active states */
|
||||
--admin-primary-light: #a5b4fc; /* Backgrounds */
|
||||
|
||||
/* Semantic Colors */
|
||||
--admin-success: #10b981; /* Success states */
|
||||
--admin-warning: #f59e0b; /* Warning states */
|
||||
--admin-error: #ef4444; /* Error states */
|
||||
--admin-info: #3b82f6; /* Information */
|
||||
|
||||
/* Neutral System */
|
||||
--admin-gray-50: #f8fafc; /* Lightest backgrounds */
|
||||
--admin-gray-100: #f1f5f9; /* Light backgrounds */
|
||||
--admin-gray-200: #e2e8f0; /* Borders */
|
||||
--admin-gray-300: #cbd5e1; /* Disabled states */
|
||||
--admin-gray-400: #94a3b8; /* Placeholders */
|
||||
--admin-gray-500: #64748b; /* Secondary text */
|
||||
--admin-gray-600: #475569; /* Primary text */
|
||||
--admin-gray-700: #334155; /* Headings */
|
||||
--admin-gray-800: #1e293b; /* Dark text */
|
||||
--admin-gray-900: #0f172a; /* Darkest elements */
|
||||
|
||||
/* Dark Theme */
|
||||
--admin-dark-bg: #0f172a;
|
||||
--admin-dark-surface: #1e293b;
|
||||
--admin-dark-border: #334155;
|
||||
--admin-dark-text: #f1f5f9;
|
||||
```
|
||||
|
||||
### Typography
|
||||
|
||||
```css
|
||||
/* Font Stacks */
|
||||
--admin-font-sans: 'Inter', system-ui, -apple-system, sans-serif;
|
||||
--admin-font-mono: 'SF Mono', 'Monaco', 'Cascadia Code', monospace;
|
||||
|
||||
/* Type Scale */
|
||||
--admin-text-xs: 0.75rem; /* 12px - Small labels */
|
||||
--admin-text-sm: 0.875rem; /* 14px - Body text */
|
||||
--admin-text-base: 1rem; /* 16px - Default */
|
||||
--admin-text-lg: 1.125rem; /* 18px - Large body */
|
||||
--admin-text-xl: 1.25rem; /* 20px - Small headings */
|
||||
--admin-text-2xl: 1.5rem; /* 24px - Section headings */
|
||||
--admin-text-3xl: 1.875rem; /* 30px - Page titles */
|
||||
--admin-text-4xl: 2.25rem; /* 36px - Large titles */
|
||||
|
||||
/* Font Weights */
|
||||
--admin-font-light: 300;
|
||||
--admin-font-normal: 400;
|
||||
--admin-font-medium: 500;
|
||||
--admin-font-semibold: 600;
|
||||
--admin-font-bold: 700;
|
||||
```
|
||||
|
||||
### Spacing System
|
||||
|
||||
```css
|
||||
/* 4px base unit scaling */
|
||||
--admin-space-0: 0;
|
||||
--admin-space-1: 0.25rem; /* 4px */
|
||||
--admin-space-2: 0.5rem; /* 8px */
|
||||
--admin-space-3: 0.75rem; /* 12px */
|
||||
--admin-space-4: 1rem; /* 16px */
|
||||
--admin-space-5: 1.25rem; /* 20px */
|
||||
--admin-space-6: 1.5rem; /* 24px */
|
||||
--admin-space-8: 2rem; /* 32px */
|
||||
--admin-space-10: 2.5rem; /* 40px */
|
||||
--admin-space-12: 3rem; /* 48px */
|
||||
--admin-space-16: 4rem; /* 64px */
|
||||
--admin-space-20: 5rem; /* 80px */
|
||||
--admin-space-24: 6rem; /* 96px */
|
||||
```
|
||||
|
||||
### Elevation & Shadows
|
||||
|
||||
```css
|
||||
/* Shadow System */
|
||||
--admin-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
|
||||
--admin-shadow-base: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
|
||||
--admin-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
||||
--admin-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
|
||||
--admin-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
|
||||
|
||||
/* Border Radius */
|
||||
--admin-radius-none: 0;
|
||||
--admin-radius-sm: 0.125rem; /* 2px */
|
||||
--admin-radius-base: 0.25rem; /* 4px */
|
||||
--admin-radius-md: 0.375rem; /* 6px */
|
||||
--admin-radius-lg: 0.5rem; /* 8px */
|
||||
--admin-radius-xl: 0.75rem; /* 12px */
|
||||
--admin-radius-2xl: 1rem; /* 16px */
|
||||
--admin-radius-full: 9999px; /* Pill shape */
|
||||
```
|
||||
|
||||
## 🏗 Layout System
|
||||
|
||||
### Grid Foundation
|
||||
|
||||
```css
|
||||
/* Admin Layout Grid */
|
||||
.admin-layout {
|
||||
display: grid;
|
||||
grid-template-areas:
|
||||
"header header"
|
||||
"nav main"
|
||||
"nav footer";
|
||||
grid-template-columns: 250px 1fr;
|
||||
grid-template-rows: auto 1fr auto;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.admin-header { grid-area: header; }
|
||||
.admin-nav { grid-area: nav; }
|
||||
.admin-main { grid-area: main; }
|
||||
.admin-footer { grid-area: footer; }
|
||||
|
||||
/* Responsive Adaptations */
|
||||
@media (max-width: 768px) {
|
||||
.admin-layout {
|
||||
grid-template-areas:
|
||||
"header"
|
||||
"main"
|
||||
"footer";
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.admin-nav {
|
||||
transform: translateX(-100%);
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
|
||||
.admin-nav.is-open {
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Content Layout
|
||||
|
||||
```css
|
||||
/* Page Structure */
|
||||
.page-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: var(--admin-space-6) 0;
|
||||
border-bottom: 1px solid var(--admin-gray-200);
|
||||
margin-bottom: var(--admin-space-6);
|
||||
}
|
||||
|
||||
.page-content {
|
||||
max-width: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* Content Sections */
|
||||
.admin-section {
|
||||
background: var(--admin-surface);
|
||||
border: 1px solid var(--admin-border);
|
||||
border-radius: var(--admin-radius-lg);
|
||||
padding: var(--admin-space-6);
|
||||
margin-bottom: var(--admin-space-6);
|
||||
}
|
||||
|
||||
.admin-section + .admin-section {
|
||||
margin-top: var(--admin-space-8);
|
||||
}
|
||||
```
|
||||
|
||||
## 🧩 Component Architecture
|
||||
|
||||
### Base Component Classes
|
||||
|
||||
```css
|
||||
/* Button System */
|
||||
.admin-button {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: var(--admin-space-2);
|
||||
padding: var(--admin-space-2) var(--admin-space-4);
|
||||
border: 1px solid transparent;
|
||||
border-radius: var(--admin-radius-md);
|
||||
font-family: var(--admin-font-sans);
|
||||
font-size: var(--admin-text-sm);
|
||||
font-weight: var(--admin-font-medium);
|
||||
line-height: 1.5;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
transition: all 0.15s ease;
|
||||
|
||||
&:focus {
|
||||
outline: 2px solid var(--admin-primary);
|
||||
outline-offset: 2px;
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
}
|
||||
|
||||
/* Button Variants */
|
||||
.admin-button--primary {
|
||||
background: var(--admin-primary);
|
||||
color: white;
|
||||
|
||||
&:hover:not(:disabled) {
|
||||
background: var(--admin-primary-hover);
|
||||
}
|
||||
}
|
||||
|
||||
.admin-button--secondary {
|
||||
background: var(--admin-gray-100);
|
||||
color: var(--admin-gray-700);
|
||||
border-color: var(--admin-gray-200);
|
||||
|
||||
&:hover:not(:disabled) {
|
||||
background: var(--admin-gray-200);
|
||||
}
|
||||
}
|
||||
|
||||
.admin-button--ghost {
|
||||
background: transparent;
|
||||
color: var(--admin-gray-600);
|
||||
|
||||
&:hover:not(:disabled) {
|
||||
background: var(--admin-gray-100);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Form Components
|
||||
|
||||
```css
|
||||
/* Input System */
|
||||
.admin-input {
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding: var(--admin-space-3);
|
||||
border: 1px solid var(--admin-gray-300);
|
||||
border-radius: var(--admin-radius-md);
|
||||
font-family: var(--admin-font-sans);
|
||||
font-size: var(--admin-text-sm);
|
||||
line-height: 1.5;
|
||||
background: white;
|
||||
transition: all 0.15s ease;
|
||||
|
||||
&:focus {
|
||||
outline: none;
|
||||
border-color: var(--admin-primary);
|
||||
box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
background: var(--admin-gray-50);
|
||||
color: var(--admin-gray-400);
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
&.is-error {
|
||||
border-color: var(--admin-error);
|
||||
|
||||
&:focus {
|
||||
box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Form Groups */
|
||||
.admin-form-group {
|
||||
margin-bottom: var(--admin-space-4);
|
||||
}
|
||||
|
||||
.admin-label {
|
||||
display: block;
|
||||
margin-bottom: var(--admin-space-2);
|
||||
font-size: var(--admin-text-sm);
|
||||
font-weight: var(--admin-font-medium);
|
||||
color: var(--admin-gray-700);
|
||||
}
|
||||
|
||||
.admin-help-text {
|
||||
margin-top: var(--admin-space-1);
|
||||
font-size: var(--admin-text-xs);
|
||||
color: var(--admin-gray-500);
|
||||
}
|
||||
|
||||
.admin-error-text {
|
||||
margin-top: var(--admin-space-1);
|
||||
font-size: var(--admin-text-xs);
|
||||
color: var(--admin-error);
|
||||
}
|
||||
```
|
||||
|
||||
### Data Display Components
|
||||
|
||||
```css
|
||||
/* Stats Cards */
|
||||
.admin-stats-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
|
||||
gap: var(--admin-space-6);
|
||||
margin-bottom: var(--admin-space-8);
|
||||
}
|
||||
|
||||
.admin-stat-card {
|
||||
background: var(--admin-surface);
|
||||
border: 1px solid var(--admin-border);
|
||||
border-radius: var(--admin-radius-lg);
|
||||
padding: var(--admin-space-6);
|
||||
|
||||
&:hover {
|
||||
border-color: var(--admin-primary-light);
|
||||
transform: translateY(-1px);
|
||||
box-shadow: var(--admin-shadow-md);
|
||||
}
|
||||
}
|
||||
|
||||
.admin-stat-label {
|
||||
display: block;
|
||||
font-size: var(--admin-text-sm);
|
||||
font-weight: var(--admin-font-medium);
|
||||
color: var(--admin-gray-600);
|
||||
margin-bottom: var(--admin-space-2);
|
||||
}
|
||||
|
||||
.admin-stat-value {
|
||||
font-size: var(--admin-text-3xl);
|
||||
font-weight: var(--admin-font-bold);
|
||||
color: var(--admin-gray-900);
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.admin-stat-trend {
|
||||
margin-top: var(--admin-space-2);
|
||||
font-size: var(--admin-text-xs);
|
||||
|
||||
&.is-positive { color: var(--admin-success); }
|
||||
&.is-negative { color: var(--admin-error); }
|
||||
&.is-neutral { color: var(--admin-gray-500); }
|
||||
}
|
||||
```
|
||||
|
||||
### Tables
|
||||
|
||||
```css
|
||||
/* Admin Tables */
|
||||
.admin-table {
|
||||
width: 100%;
|
||||
border-collapse: separate;
|
||||
border-spacing: 0;
|
||||
background: var(--admin-surface);
|
||||
border: 1px solid var(--admin-border);
|
||||
border-radius: var(--admin-radius-lg);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.admin-table th {
|
||||
background: var(--admin-gray-50);
|
||||
padding: var(--admin-space-4);
|
||||
text-align: left;
|
||||
font-size: var(--admin-text-xs);
|
||||
font-weight: var(--admin-font-semibold);
|
||||
color: var(--admin-gray-600);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
border-bottom: 1px solid var(--admin-border);
|
||||
|
||||
&[data-sort] {
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
|
||||
&:hover {
|
||||
background: var(--admin-gray-100);
|
||||
}
|
||||
|
||||
&.is-sorted-asc::after {
|
||||
content: " ↑";
|
||||
color: var(--admin-primary);
|
||||
}
|
||||
|
||||
&.is-sorted-desc::after {
|
||||
content: " ↓";
|
||||
color: var(--admin-primary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.admin-table td {
|
||||
padding: var(--admin-space-4);
|
||||
border-bottom: 1px solid var(--admin-gray-100);
|
||||
font-size: var(--admin-text-sm);
|
||||
color: var(--admin-gray-700);
|
||||
}
|
||||
|
||||
.admin-table tbody tr:hover {
|
||||
background: var(--admin-gray-50);
|
||||
}
|
||||
|
||||
.admin-table tbody tr:last-child td {
|
||||
border-bottom: none;
|
||||
}
|
||||
```
|
||||
|
||||
## 🌓 Dark Mode Support
|
||||
|
||||
```css
|
||||
/* Dark Theme Variables */
|
||||
[data-theme="dark"] {
|
||||
--admin-surface: var(--admin-dark-surface);
|
||||
--admin-border: var(--admin-dark-border);
|
||||
--admin-text: var(--admin-dark-text);
|
||||
--admin-bg: var(--admin-dark-bg);
|
||||
|
||||
/* Component Adaptations */
|
||||
--admin-gray-50: #334155;
|
||||
--admin-gray-100: #475569;
|
||||
--admin-gray-200: #64748b;
|
||||
--admin-gray-600: #cbd5e1;
|
||||
--admin-gray-700: #e2e8f0;
|
||||
--admin-gray-900: var(--admin-dark-text);
|
||||
}
|
||||
|
||||
/* Theme Toggle Component */
|
||||
.admin-theme-toggle {
|
||||
position: relative;
|
||||
width: 48px;
|
||||
height: 24px;
|
||||
background: var(--admin-gray-200);
|
||||
border: none;
|
||||
border-radius: var(--admin-radius-full);
|
||||
cursor: pointer;
|
||||
transition: background 0.2s ease;
|
||||
|
||||
&::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 2px;
|
||||
left: 2px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background: white;
|
||||
border-radius: 50%;
|
||||
transition: transform 0.2s ease;
|
||||
}
|
||||
|
||||
&.is-dark {
|
||||
background: var(--admin-primary);
|
||||
|
||||
&::after {
|
||||
transform: translateX(24px);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## ♿ Accessibility Standards
|
||||
|
||||
### Focus Management
|
||||
|
||||
```css
|
||||
/* Focus Styles */
|
||||
.admin-focus-visible {
|
||||
outline: 2px solid var(--admin-primary);
|
||||
outline-offset: 2px;
|
||||
border-radius: var(--admin-radius-sm);
|
||||
}
|
||||
|
||||
/* Skip Links */
|
||||
.admin-skip-link {
|
||||
position: absolute;
|
||||
top: -40px;
|
||||
left: 6px;
|
||||
background: var(--admin-primary);
|
||||
color: white;
|
||||
padding: 8px;
|
||||
text-decoration: none;
|
||||
border-radius: var(--admin-radius-md);
|
||||
z-index: 1000;
|
||||
|
||||
&:focus {
|
||||
top: 6px;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### ARIA Support
|
||||
|
||||
```html
|
||||
<!-- Navigation with proper ARIA -->
|
||||
<nav class="admin-nav" role="navigation" aria-label="Main navigation">
|
||||
<ul role="menubar">
|
||||
<li role="none">
|
||||
<a href="/admin" role="menuitem" aria-current="page">Dashboard</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<!-- Data tables with proper headers -->
|
||||
<table class="admin-table" role="table" aria-label="User data">
|
||||
<thead>
|
||||
<tr role="row">
|
||||
<th role="columnheader" aria-sort="ascending">Name</th>
|
||||
<th role="columnheader">Email</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody role="rowgroup">
|
||||
<tr role="row">
|
||||
<td role="gridcell">John Doe</td>
|
||||
<td role="gridcell">john@example.com</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
```
|
||||
|
||||
## 📱 Responsive Behavior
|
||||
|
||||
### Breakpoint System
|
||||
|
||||
```css
|
||||
/* Mobile First Breakpoints */
|
||||
.admin-responsive {
|
||||
/* Mobile (default) */
|
||||
padding: var(--admin-space-4);
|
||||
|
||||
/* Tablet */
|
||||
@media (min-width: 768px) {
|
||||
padding: var(--admin-space-6);
|
||||
}
|
||||
|
||||
/* Desktop */
|
||||
@media (min-width: 1024px) {
|
||||
padding: var(--admin-space-8);
|
||||
}
|
||||
|
||||
/* Large Desktop */
|
||||
@media (min-width: 1280px) {
|
||||
padding: var(--admin-space-12);
|
||||
}
|
||||
}
|
||||
|
||||
/* Navigation Adaptations */
|
||||
@media (max-width: 767px) {
|
||||
.admin-nav {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 280px;
|
||||
height: 100vh;
|
||||
background: var(--admin-surface);
|
||||
border-right: 1px solid var(--admin-border);
|
||||
transform: translateX(-100%);
|
||||
transition: transform 0.3s ease;
|
||||
z-index: 1000;
|
||||
|
||||
&.is-open {
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
|
||||
.admin-nav-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
transition: all 0.3s ease;
|
||||
z-index: 999;
|
||||
|
||||
&.is-active {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
*For implementation examples, see [Admin Components](components.md)*
|
||||
*For JavaScript integration, see [JavaScript Modules](../javascript.md)*
|
||||
*For performance guidelines, see [CSS Architecture](../css-architecture.md)*
|
||||
Reference in New Issue
Block a user