@motor-cms/ui-admin 1.0.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +77 -0
- package/app/components/form/inputs/CategoryTreeInput.vue +154 -0
- package/app/components/form/inputs/CategoryTreePicker.vue +355 -0
- package/app/components/form/inputs/NestedDraggable.vue +217 -0
- package/app/components/form/inputs/QuicklinksInput.vue +186 -0
- package/app/lang/de/motor-admin/CLAUDE.md +21 -0
- package/app/lang/de/motor-admin/ai_system_prompts.json +12 -0
- package/app/lang/de/motor-admin/categories.json +12 -0
- package/app/lang/de/motor-admin/category_trees.json +14 -0
- package/app/lang/de/motor-admin/clients.json +26 -0
- package/app/lang/de/motor-admin/config_variables.json +14 -0
- package/app/lang/de/motor-admin/domains.json +19 -0
- package/app/lang/de/motor-admin/email_templates.json +38 -0
- package/app/lang/de/motor-admin/global.json +5 -0
- package/app/lang/de/motor-admin/languages.json +16 -0
- package/app/lang/de/motor-admin/permissions.json +14 -0
- package/app/lang/de/motor-admin/roles.json +15 -0
- package/app/lang/de/motor-admin/users.json +22 -0
- package/app/lang/en/motor-admin/CLAUDE.md +7 -0
- package/app/lang/en/motor-admin/ai_system_prompts.json +12 -0
- package/app/lang/en/motor-admin/categories.json +12 -0
- package/app/lang/en/motor-admin/category_trees.json +14 -0
- package/app/lang/en/motor-admin/clients.json +26 -0
- package/app/lang/en/motor-admin/config_variables.json +14 -0
- package/app/lang/en/motor-admin/domains.json +18 -0
- package/app/lang/en/motor-admin/email_templates.json +33 -0
- package/app/lang/en/motor-admin/global.json +5 -0
- package/app/lang/en/motor-admin/languages.json +16 -0
- package/app/lang/en/motor-admin/permissions.json +14 -0
- package/app/lang/en/motor-admin/roles.json +15 -0
- package/app/lang/en/motor-admin/users.json +22 -0
- package/app/pages/dashboard.vue +5 -0
- package/app/pages/index.vue +39 -0
- package/app/pages/login.vue +85 -0
- package/app/pages/motor-admin/ai-system-prompts/CLAUDE.md +7 -0
- package/app/pages/motor-admin/ai-system-prompts/[id]/edit.vue +48 -0
- package/app/pages/motor-admin/ai-system-prompts/create.vue +40 -0
- package/app/pages/motor-admin/ai-system-prompts/index.vue +68 -0
- package/app/pages/motor-admin/category-trees/CLAUDE.md +7 -0
- package/app/pages/motor-admin/category-trees/[id]/CLAUDE.md +7 -0
- package/app/pages/motor-admin/category-trees/[id]/categories/[categoryId]/edit.vue +73 -0
- package/app/pages/motor-admin/category-trees/[id]/categories/create.vue +64 -0
- package/app/pages/motor-admin/category-trees/[id]/edit.vue +45 -0
- package/app/pages/motor-admin/category-trees/[id]/index.vue +81 -0
- package/app/pages/motor-admin/category-trees/create.vue +37 -0
- package/app/pages/motor-admin/category-trees/index.vue +54 -0
- package/app/pages/motor-admin/clients/CLAUDE.md +11 -0
- package/app/pages/motor-admin/clients/[id]/CLAUDE.md +11 -0
- package/app/pages/motor-admin/clients/[id]/edit.vue +45 -0
- package/app/pages/motor-admin/clients/create.vue +37 -0
- package/app/pages/motor-admin/clients/index.vue +46 -0
- package/app/pages/motor-admin/config-variables/CLAUDE.md +11 -0
- package/app/pages/motor-admin/config-variables/[id]/edit.vue +44 -0
- package/app/pages/motor-admin/config-variables/create.vue +36 -0
- package/app/pages/motor-admin/config-variables/index.vue +66 -0
- package/app/pages/motor-admin/domains/CLAUDE.md +11 -0
- package/app/pages/motor-admin/domains/[id]/edit.vue +54 -0
- package/app/pages/motor-admin/domains/create.vue +46 -0
- package/app/pages/motor-admin/domains/index.vue +98 -0
- package/app/pages/motor-admin/email-templates/CLAUDE.md +12 -0
- package/app/pages/motor-admin/email-templates/[id]/CLAUDE.md +7 -0
- package/app/pages/motor-admin/email-templates/[id]/edit.vue +56 -0
- package/app/pages/motor-admin/email-templates/create.vue +48 -0
- package/app/pages/motor-admin/email-templates/index.vue +67 -0
- package/app/pages/motor-admin/index.vue +12 -0
- package/app/pages/motor-admin/languages/CLAUDE.md +7 -0
- package/app/pages/motor-admin/languages/[id]/edit.vue +44 -0
- package/app/pages/motor-admin/languages/create.vue +36 -0
- package/app/pages/motor-admin/languages/index.vue +44 -0
- package/app/pages/motor-admin/permission-groups/CLAUDE.md +14 -0
- package/app/pages/motor-admin/permission-groups/[id]/CLAUDE.md +11 -0
- package/app/pages/motor-admin/permission-groups/[id]/edit.vue +49 -0
- package/app/pages/motor-admin/permission-groups/create.vue +41 -0
- package/app/pages/motor-admin/permission-groups/index.vue +43 -0
- package/app/pages/motor-admin/roles/CLAUDE.md +7 -0
- package/app/pages/motor-admin/roles/[id]/edit.vue +47 -0
- package/app/pages/motor-admin/roles/create.vue +40 -0
- package/app/pages/motor-admin/roles/index.vue +45 -0
- package/app/pages/motor-admin/theme-preview/CLAUDE.md +7 -0
- package/app/pages/motor-admin/theme-preview/index.vue +4801 -0
- package/app/pages/motor-admin/theme-preview/themes/CLAUDE.md +11 -0
- package/app/pages/motor-admin/theme-preview/themes/asymmetric-brutalist.md +381 -0
- package/app/pages/motor-admin/theme-preview/themes/bold-modern.md +231 -0
- package/app/pages/motor-admin/theme-preview/themes/geometric-minimal.md +778 -0
- package/app/pages/motor-admin/theme-preview/themes/gradient-flow.md +1057 -0
- package/app/pages/motor-admin/theme-preview/themes/liquid-glass.md +823 -0
- package/app/pages/motor-admin/theme-preview/themes/neon-amber.md +1223 -0
- package/app/pages/motor-admin/theme-preview/themes/neon-terminal.md +779 -0
- package/app/pages/motor-admin/theme-preview/themes/neon-violet.md +1134 -0
- package/app/pages/motor-admin/theme-preview/themes/professional-clean.md +232 -0
- package/app/pages/motor-admin/theme-preview/themes/refined-brutalist.md +462 -0
- package/app/pages/motor-admin/theme-preview/themes/wild-card.md +263 -0
- package/app/pages/motor-admin/users/CLAUDE.md +17 -0
- package/app/pages/motor-admin/users/[id]/CLAUDE.md +11 -0
- package/app/pages/motor-admin/users/[id]/edit.vue +83 -0
- package/app/pages/motor-admin/users/create.vue +40 -0
- package/app/pages/motor-admin/users/index.vue +66 -0
- package/app/pages/profile.vue +363 -0
- package/app/pages/search.vue +91 -0
- package/app/types/generated/form-meta.ts +258 -0
- package/app/types/generated/grid-meta.ts +172 -0
- package/nuxt.config.ts +1 -0
- package/package.json +26 -0
|
@@ -0,0 +1,1057 @@
|
|
|
1
|
+
# Gradient Flow Theme
|
|
2
|
+
|
|
3
|
+
> Gradients become the primary design language -- not as decoration, but as structure. Every surface that would normally be a flat color gets a subtle-to-bold gradient instead. Sidebar, buttons, badges, borders, focus rings, table headers -- all flowing with color. The effect is liquid, luminous, and modern. Think: Apple's iOS icon gradients applied to an entire admin panel, Stripe's blue-to-indigo trust signals, Vercel's text gradients. Never 2008 Web 2.0 glossy -- always restrained, purposeful, and optically smooth.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Color Palette
|
|
8
|
+
|
|
9
|
+
### Design Philosophy
|
|
10
|
+
|
|
11
|
+
Flat color is comfortable. Gradients are risky -- they can go gaudy in a heartbeat. The Gradient Flow theme succeeds by treating gradients the way a good architect treats lighting: **every gradient has a reason, a direction, and a stopping point.** We define three gradient families (primary, secondary, warm) plus a neutral base system. Gradients flow in consistent directions (left-to-right for horizontal elements, top-to-bottom for vertical ones), creating a unified sense of movement across the interface. Color stops are carefully chosen so transitions feel smooth, never banded.
|
|
12
|
+
|
|
13
|
+
### Gradient Families
|
|
14
|
+
|
|
15
|
+
#### Primary Gradient: Indigo to Violet
|
|
16
|
+
|
|
17
|
+
The workhorse gradient. Used on the sidebar, primary buttons, active states, and key accent elements. The indigo-to-violet shift reads as confident, tech-forward, and trustworthy. The color distance is short enough to feel cohesive, long enough to register as a gradient.
|
|
18
|
+
|
|
19
|
+
| Token | Hex | Role |
|
|
20
|
+
|----------------------|-----------|------------------------------|
|
|
21
|
+
| indigo-start | #4f46e5 | Gradient start (indigo-600) |
|
|
22
|
+
| indigo-mid | #6366f1 | Optional midpoint (indigo-500)|
|
|
23
|
+
| violet-end | #8b5cf6 | Gradient end (violet-500) |
|
|
24
|
+
| indigo-dark-start | #3730a3 | Dark mode start (indigo-800) |
|
|
25
|
+
| violet-dark-end | #6d28d9 | Dark mode end (violet-700) |
|
|
26
|
+
|
|
27
|
+
**CSS:**
|
|
28
|
+
```css
|
|
29
|
+
--gradient-primary: linear-gradient(135deg, #4f46e5, #8b5cf6);
|
|
30
|
+
--gradient-primary-hover: linear-gradient(135deg, #4338ca, #7c3aed);
|
|
31
|
+
--gradient-primary-vertical: linear-gradient(180deg, #4f46e5, #8b5cf6);
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
#### Secondary Gradient: Teal to Cyan
|
|
35
|
+
|
|
36
|
+
Used for secondary actions, info states, badges, and highlights. The cool teal-to-cyan feels refreshing and complementary to the warm violet primary without competing for attention.
|
|
37
|
+
|
|
38
|
+
| Token | Hex | Role |
|
|
39
|
+
|----------------------|-----------|------------------------------|
|
|
40
|
+
| teal-start | #0d9488 | Gradient start (teal-600) |
|
|
41
|
+
| cyan-end | #06b6d4 | Gradient end (cyan-500) |
|
|
42
|
+
| teal-dark-start | #0f766e | Dark mode start (teal-700) |
|
|
43
|
+
| cyan-dark-end | #0891b2 | Dark mode end (cyan-600) |
|
|
44
|
+
|
|
45
|
+
**CSS:**
|
|
46
|
+
```css
|
|
47
|
+
--gradient-secondary: linear-gradient(135deg, #0d9488, #06b6d4);
|
|
48
|
+
--gradient-secondary-hover: linear-gradient(135deg, #0f766e, #0891b2);
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
#### Warm Gradient: Rose to Orange
|
|
52
|
+
|
|
53
|
+
Used sparingly for destructive actions, error states, notifications, and attention-grabbing moments. The warm temperature contrasts with the cool primary/secondary gradients, making it immediately noticeable without feeling alarming.
|
|
54
|
+
|
|
55
|
+
| Token | Hex | Role |
|
|
56
|
+
|----------------------|-----------|------------------------------|
|
|
57
|
+
| rose-start | #e11d48 | Gradient start (rose-600) |
|
|
58
|
+
| orange-end | #f97316 | Gradient end (orange-500) |
|
|
59
|
+
| rose-dark-start | #be123c | Dark mode start (rose-700) |
|
|
60
|
+
| orange-dark-end | #ea580c | Dark mode end (orange-600) |
|
|
61
|
+
|
|
62
|
+
**CSS:**
|
|
63
|
+
```css
|
|
64
|
+
--gradient-warm: linear-gradient(135deg, #e11d48, #f97316);
|
|
65
|
+
--gradient-warm-hover: linear-gradient(135deg, #be123c, #ea580c);
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
#### Subtle Gradient: Whisper-soft for backgrounds
|
|
69
|
+
|
|
70
|
+
Ultra-low-contrast gradients for card backgrounds, hover states, and areas that need just a touch of depth without drawing attention. These are almost invisible -- a 2-3% lightness shift that registers subconsciously.
|
|
71
|
+
|
|
72
|
+
**CSS:**
|
|
73
|
+
```css
|
|
74
|
+
/* Light mode */
|
|
75
|
+
--gradient-subtle: linear-gradient(135deg, #f8fafc, #f1f5f9);
|
|
76
|
+
--gradient-subtle-warm: linear-gradient(135deg, #faf5ff, #f0f9ff);
|
|
77
|
+
--gradient-subtle-card: linear-gradient(180deg, #ffffff, #f8fafc);
|
|
78
|
+
|
|
79
|
+
/* Dark mode */
|
|
80
|
+
--gradient-subtle-dark: linear-gradient(135deg, #1e1b4b 0%, #0f172a 100%);
|
|
81
|
+
--gradient-subtle-warm-dark: linear-gradient(135deg, #1e1b4b, #164e63);
|
|
82
|
+
--gradient-subtle-card-dark: linear-gradient(180deg, #1e293b, #0f172a);
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Flat Colors (Non-Gradient)
|
|
86
|
+
|
|
87
|
+
Not everything gets a gradient. Text, borders, and small UI elements use flat colors for clarity and readability.
|
|
88
|
+
|
|
89
|
+
| Token | Light Mode | Dark Mode | Usage |
|
|
90
|
+
|------------------|-------------|-------------|----------------------------------------|
|
|
91
|
+
| text-primary | #0f172a | #f1f5f9 | Headings, primary text (slate-900/100) |
|
|
92
|
+
| text-secondary | #64748b | #94a3b8 | Body text, descriptions (slate-500/400)|
|
|
93
|
+
| text-muted | #94a3b8 | #64748b | Placeholders, captions (slate-400/500) |
|
|
94
|
+
| surface-page | #f8fafc | #020617 | Page background (slate-50/950) |
|
|
95
|
+
| surface-card | #ffffff | #0f172a | Card background (white/slate-900) |
|
|
96
|
+
| surface-elevated | #f1f5f9 | #1e293b | Sidebar, elevated surfaces (slate-100/800)|
|
|
97
|
+
| border-default | #e2e8f0 | #334155 | Default borders (slate-200/700) |
|
|
98
|
+
| border-strong | #cbd5e1 | #475569 | Emphasized borders (slate-300/600) |
|
|
99
|
+
|
|
100
|
+
### Semantic Colors (Gradient-Enhanced)
|
|
101
|
+
|
|
102
|
+
| Purpose | Gradient | Flat Fallback | Usage |
|
|
103
|
+
|-----------|----------------------------------------------------|---------------|--------------------------------|
|
|
104
|
+
| Success | `linear-gradient(135deg, #059669, #10b981)` | #10b981 | Success badges, confirmations |
|
|
105
|
+
| Warning | `linear-gradient(135deg, #d97706, #f59e0b)` | #f59e0b | Warning badges, alerts |
|
|
106
|
+
| Error | `linear-gradient(135deg, #e11d48, #f97316)` | #e11d48 | Error states, destructive |
|
|
107
|
+
| Info | `linear-gradient(135deg, #0d9488, #06b6d4)` | #06b6d4 | Info badges, tooltips |
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Gradient Definitions
|
|
112
|
+
|
|
113
|
+
### Complete Gradient System (CSS Custom Properties)
|
|
114
|
+
|
|
115
|
+
```css
|
|
116
|
+
:root {
|
|
117
|
+
/* === Primary: Indigo to Violet === */
|
|
118
|
+
--gradient-primary: linear-gradient(135deg, #4f46e5 0%, #8b5cf6 100%);
|
|
119
|
+
--gradient-primary-hover: linear-gradient(135deg, #4338ca 0%, #7c3aed 100%);
|
|
120
|
+
--gradient-primary-active: linear-gradient(135deg, #3730a3 0%, #6d28d9 100%);
|
|
121
|
+
--gradient-primary-vertical: linear-gradient(180deg, #4f46e5 0%, #8b5cf6 100%);
|
|
122
|
+
--gradient-primary-text: linear-gradient(135deg, #6366f1 0%, #a78bfa 100%);
|
|
123
|
+
|
|
124
|
+
/* === Secondary: Teal to Cyan === */
|
|
125
|
+
--gradient-secondary: linear-gradient(135deg, #0d9488 0%, #06b6d4 100%);
|
|
126
|
+
--gradient-secondary-hover: linear-gradient(135deg, #0f766e 0%, #0891b2 100%);
|
|
127
|
+
|
|
128
|
+
/* === Warm: Rose to Orange === */
|
|
129
|
+
--gradient-warm: linear-gradient(135deg, #e11d48 0%, #f97316 100%);
|
|
130
|
+
--gradient-warm-hover: linear-gradient(135deg, #be123c 0%, #ea580c 100%);
|
|
131
|
+
|
|
132
|
+
/* === Subtle: Near-transparent shifts === */
|
|
133
|
+
--gradient-subtle: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
|
|
134
|
+
--gradient-subtle-warm: linear-gradient(135deg, #faf5ff 0%, #f0f9ff 100%);
|
|
135
|
+
--gradient-subtle-card: linear-gradient(180deg, #ffffff 0%, #f8fafc 100%);
|
|
136
|
+
|
|
137
|
+
/* === Semantic === */
|
|
138
|
+
--gradient-success: linear-gradient(135deg, #059669 0%, #10b981 100%);
|
|
139
|
+
--gradient-warning: linear-gradient(135deg, #d97706 0%, #f59e0b 100%);
|
|
140
|
+
--gradient-error: linear-gradient(135deg, #e11d48 0%, #f97316 100%);
|
|
141
|
+
--gradient-info: linear-gradient(135deg, #0d9488 0%, #06b6d4 100%);
|
|
142
|
+
|
|
143
|
+
/* === Border Gradients (used with background-clip trick) === */
|
|
144
|
+
--gradient-border-primary: linear-gradient(135deg, #4f46e5, #8b5cf6);
|
|
145
|
+
--gradient-border-secondary: linear-gradient(135deg, #0d9488, #06b6d4);
|
|
146
|
+
--gradient-border-warm: linear-gradient(135deg, #e11d48, #f97316);
|
|
147
|
+
--gradient-border-subtle: linear-gradient(135deg, #c7d2fe, #ddd6fe);
|
|
148
|
+
|
|
149
|
+
/* === Mesh / Aurora (page background accents) === */
|
|
150
|
+
--gradient-aurora:
|
|
151
|
+
radial-gradient(ellipse at 20% 0%, rgba(99,102,241,0.15) 0%, transparent 50%),
|
|
152
|
+
radial-gradient(ellipse at 80% 0%, rgba(139,92,246,0.10) 0%, transparent 50%),
|
|
153
|
+
radial-gradient(ellipse at 60% 100%, rgba(6,182,212,0.08) 0%, transparent 50%);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* Dark mode overrides -- more saturated, deeper */
|
|
157
|
+
.dark {
|
|
158
|
+
--gradient-primary: linear-gradient(135deg, #3730a3 0%, #6d28d9 100%);
|
|
159
|
+
--gradient-primary-hover: linear-gradient(135deg, #312e81 0%, #5b21b6 100%);
|
|
160
|
+
--gradient-primary-active: linear-gradient(135deg, #312e81 0%, #4c1d95 100%);
|
|
161
|
+
--gradient-primary-vertical: linear-gradient(180deg, #3730a3 0%, #6d28d9 100%);
|
|
162
|
+
--gradient-primary-text: linear-gradient(135deg, #818cf8 0%, #c4b5fd 100%);
|
|
163
|
+
|
|
164
|
+
--gradient-secondary: linear-gradient(135deg, #0f766e 0%, #0891b2 100%);
|
|
165
|
+
--gradient-secondary-hover: linear-gradient(135deg, #115e59 0%, #0e7490 100%);
|
|
166
|
+
|
|
167
|
+
--gradient-warm: linear-gradient(135deg, #be123c 0%, #ea580c 100%);
|
|
168
|
+
--gradient-warm-hover: linear-gradient(135deg, #9f1239 0%, #c2410c 100%);
|
|
169
|
+
|
|
170
|
+
--gradient-subtle: linear-gradient(135deg, #1e1b4b 0%, #0f172a 100%);
|
|
171
|
+
--gradient-subtle-warm: linear-gradient(135deg, #1e1b4b 0%, #164e63 100%);
|
|
172
|
+
--gradient-subtle-card: linear-gradient(180deg, #1e293b 0%, #0f172a 100%);
|
|
173
|
+
|
|
174
|
+
--gradient-aurora:
|
|
175
|
+
radial-gradient(ellipse at 20% 0%, rgba(99,102,241,0.20) 0%, transparent 50%),
|
|
176
|
+
radial-gradient(ellipse at 80% 0%, rgba(139,92,246,0.15) 0%, transparent 50%),
|
|
177
|
+
radial-gradient(ellipse at 60% 100%, rgba(6,182,212,0.12) 0%, transparent 50%);
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Direction Convention
|
|
182
|
+
|
|
183
|
+
| Element Orientation | Gradient Direction | CSS Direction | Rationale |
|
|
184
|
+
|--------------------|--------------------|-------------------|----------------------------------------|
|
|
185
|
+
| Horizontal bar | Left to Right | `to right` / `90deg` | Follows reading direction |
|
|
186
|
+
| Vertical bar | Top to Bottom | `to bottom` / `180deg` | Follows gravity / scroll direction |
|
|
187
|
+
| Diagonal accent | Top-Left to Bottom-Right | `135deg` | Default for buttons, cards, badges |
|
|
188
|
+
| Radial accent | Center outward | `radial-gradient` | For aurora/mesh backgrounds |
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Typography
|
|
193
|
+
|
|
194
|
+
### Font Pairing: Plus Jakarta Sans (Headings) + Inter (Body)
|
|
195
|
+
|
|
196
|
+
**Plus Jakarta Sans** brings geometric confidence with friendly rounded terminals -- a perfect match for the smooth, flowing aesthetic of gradients. Its slightly wider letterforms give headings presence without aggression. **Inter** is the gold standard for UI body text: engineered for pixel-perfect screen clarity at every size, with optical sizing that adjusts weight and spacing automatically. The pairing feels modern, approachable, and premium.
|
|
197
|
+
|
|
198
|
+
**Heading Font: Plus Jakarta Sans** (Google Fonts)
|
|
199
|
+
- Weights: **700 (Bold)** for page titles and section headers, **600 (SemiBold)** for card headers and nav items
|
|
200
|
+
- Character: Geometric, rounded, confident. The soft terminals echo the smooth color transitions of gradients.
|
|
201
|
+
- Tracking: Slightly tight on headings (-0.02em to -0.03em) for a polished, editorial feel
|
|
202
|
+
|
|
203
|
+
**Body Font: Inter** (Google Fonts)
|
|
204
|
+
- Weights: **400 (Regular)** for body text, **500 (Medium)** for labels, emphasis, and table headers
|
|
205
|
+
- Features: Optical sizing (`font-optical-sizing: auto`), tabular numbers (`font-variant-numeric: tabular-nums`) for data
|
|
206
|
+
- Character: Neutral, precise, universally legible. Lets the gradient colors be the personality.
|
|
207
|
+
|
|
208
|
+
**Monospace: JetBrains Mono** (Google Fonts)
|
|
209
|
+
- Weight: 400 (Regular)
|
|
210
|
+
- Used for: code snippets, IDs in tables, technical data
|
|
211
|
+
- Character: The ligatures and large x-height keep it readable in small UI contexts
|
|
212
|
+
|
|
213
|
+
### Google Fonts Import
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,400;14..32,500&family=JetBrains+Mono:wght@400&family=Plus+Jakarta+Sans:wght@600;700&display=swap
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Type Scale
|
|
220
|
+
|
|
221
|
+
| Element | Font | Weight | Size (rem) | Size (px) | Tracking | Notes |
|
|
222
|
+
|-----------------------|-------------------|--------|-----------|-----------|-----------|--------------------------------------|
|
|
223
|
+
| Page title (h1) | Plus Jakarta Sans | 700 | 2.25 | 36px | -0.03em | Bold, commanding, not oversized |
|
|
224
|
+
| Section title (h2) | Plus Jakarta Sans | 700 | 1.5 | 24px | -0.02em | Clear hierarchy |
|
|
225
|
+
| Card header (h3) | Plus Jakarta Sans | 600 | 1.25 | 20px | -0.01em | SemiBold for lighter touch |
|
|
226
|
+
| Stat number | Plus Jakarta Sans | 700 | 3.0 | 48px | -0.04em | Large KPIs, gradient text candidate |
|
|
227
|
+
| Body text | Inter | 400 | 1.0 | 16px | 0 | Default readable size |
|
|
228
|
+
| Label / overline | Inter | 500 | 0.8125 | 13px | 0.05em | UPPERCASE, letterspaced |
|
|
229
|
+
| Small / caption | Inter | 400 | 0.75 | 12px | 0.01em | Metadata, timestamps |
|
|
230
|
+
| Table header | Inter | 500 | 0.875 | 14px | 0.04em | UPPERCASE in gradient header row |
|
|
231
|
+
| Table data | Inter | 400 | 0.875 | 14px | 0 | Tabular nums for alignment |
|
|
232
|
+
| Code / ID | JetBrains Mono | 400 | 0.8125 | 13px | 0 | Monospace for technical data |
|
|
233
|
+
| Nav item (sidebar) | Plus Jakarta Sans | 600 | 0.9375 | 15px | 0 | SemiBold, moderate size |
|
|
234
|
+
| Button text | Inter | 500 | 0.875 | 14px | 0.02em | Medium weight, slightly spaced |
|
|
235
|
+
|
|
236
|
+
### Gradient Text Effect (For Hero Elements Only)
|
|
237
|
+
|
|
238
|
+
Apply gradient color to large stat numbers, page titles, or hero text using `background-clip: text`:
|
|
239
|
+
|
|
240
|
+
```css
|
|
241
|
+
.gradient-text {
|
|
242
|
+
background: var(--gradient-primary-text);
|
|
243
|
+
-webkit-background-clip: text;
|
|
244
|
+
-webkit-text-fill-color: transparent;
|
|
245
|
+
background-clip: text;
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Use sparingly -- only on isolated hero numbers or the page title. Never on body text or navigation.
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Shape Language
|
|
254
|
+
|
|
255
|
+
### Design Philosophy
|
|
256
|
+
|
|
257
|
+
Gradients pair best with generous border-radius. Sharp corners interrupt the flow; soft corners continue it. The Gradient Flow theme uses consistently rounded shapes -- not fully circular (that reads as playful/bubbly), but substantially rounded at `12px`-`16px` for most elements. This creates the "liquid" quality that makes gradients feel intentional rather than applied.
|
|
258
|
+
|
|
259
|
+
### Border Radius System
|
|
260
|
+
|
|
261
|
+
| Token | Value | Tailwind | Used On |
|
|
262
|
+
|------------------|----------|-------------------|--------------------------------------------|
|
|
263
|
+
| radius-sm | 8px | `rounded-lg` | Badges, small chips, input addons |
|
|
264
|
+
| radius-md | 12px | `rounded-xl` | Buttons, inputs, table cells |
|
|
265
|
+
| radius-lg | 16px | `rounded-2xl` | Cards, modals, dropdowns, sidebar items |
|
|
266
|
+
| radius-xl | 24px | `rounded-3xl` | Hero cards, stat cards, feature highlights |
|
|
267
|
+
| radius-full | 9999px | `rounded-full` | Avatars, status dots, pill badges |
|
|
268
|
+
|
|
269
|
+
### Border Treatment
|
|
270
|
+
|
|
271
|
+
Borders in Gradient Flow are minimal -- the gradients themselves define boundaries. When borders are needed, they are thin (1px) and use the subtle gradient border technique for accent elements.
|
|
272
|
+
|
|
273
|
+
#### Gradient Border Technique (CSS `background-clip`)
|
|
274
|
+
|
|
275
|
+
```css
|
|
276
|
+
.gradient-border {
|
|
277
|
+
position: relative;
|
|
278
|
+
background: var(--surface-card);
|
|
279
|
+
border-radius: 16px;
|
|
280
|
+
padding: 1px; /* This becomes the border width */
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
.gradient-border::before {
|
|
284
|
+
content: '';
|
|
285
|
+
position: absolute;
|
|
286
|
+
inset: 0;
|
|
287
|
+
border-radius: inherit;
|
|
288
|
+
padding: 1px;
|
|
289
|
+
background: var(--gradient-border-primary);
|
|
290
|
+
-webkit-mask:
|
|
291
|
+
linear-gradient(#fff 0 0) content-box,
|
|
292
|
+
linear-gradient(#fff 0 0);
|
|
293
|
+
-webkit-mask-composite: xor;
|
|
294
|
+
mask-composite: exclude;
|
|
295
|
+
pointer-events: none;
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
Alternative using `background` with `background-clip`:
|
|
300
|
+
```css
|
|
301
|
+
.gradient-border-alt {
|
|
302
|
+
border: 2px solid transparent;
|
|
303
|
+
border-radius: 16px;
|
|
304
|
+
background:
|
|
305
|
+
linear-gradient(var(--surface-card), var(--surface-card)) padding-box,
|
|
306
|
+
var(--gradient-border-primary) border-box;
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
| Element | Border Treatment |
|
|
311
|
+
|----------------------|-----------------------------------------------------|
|
|
312
|
+
| Cards | 1px solid `border-default` OR gradient border accent|
|
|
313
|
+
| Featured cards | Gradient border (primary) |
|
|
314
|
+
| Buttons (primary) | None (gradient fill is sufficient) |
|
|
315
|
+
| Buttons (secondary) | 1px solid `border-strong` |
|
|
316
|
+
| Inputs | 1px solid `border-default`, gradient on focus |
|
|
317
|
+
| Sidebar | No border; gradient background defines the edge |
|
|
318
|
+
| Table | 1px solid `border-default` row separators |
|
|
319
|
+
|
|
320
|
+
### Shadow System
|
|
321
|
+
|
|
322
|
+
Shadows are soft, diffused, and tinted with the gradient's end color. No hard offset shadows -- everything feels elevated and luminous.
|
|
323
|
+
|
|
324
|
+
| Token | CSS | Usage |
|
|
325
|
+
|------------------|-------------------------------------------------------|------------------------------------|
|
|
326
|
+
| shadow-sm | `0 1px 3px rgba(79,70,229,0.08)` | Buttons rest state, small cards |
|
|
327
|
+
| shadow-md | `0 4px 12px rgba(79,70,229,0.10)` | Cards, dropdowns |
|
|
328
|
+
| shadow-lg | `0 8px 24px rgba(79,70,229,0.12)` | Modals, elevated panels |
|
|
329
|
+
| shadow-xl | `0 12px 40px rgba(79,70,229,0.15)` | Active modals, hero cards |
|
|
330
|
+
| shadow-glow | `0 0 20px rgba(99,102,241,0.25)` | Focused inputs, active sidebar |
|
|
331
|
+
|
|
332
|
+
Dark mode shadows: increase opacity by 50% and deepen the tint color.
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## Component Styling
|
|
337
|
+
|
|
338
|
+
### Sidebar
|
|
339
|
+
|
|
340
|
+
The sidebar is the most prominent gradient surface in the interface -- a vertical gradient that anchors the entire layout.
|
|
341
|
+
|
|
342
|
+
**Light Mode:**
|
|
343
|
+
```css
|
|
344
|
+
.sidebar {
|
|
345
|
+
background: linear-gradient(180deg, #4f46e5 0%, #7c3aed 60%, #8b5cf6 100%);
|
|
346
|
+
color: #ffffff;
|
|
347
|
+
width: 260px;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
.sidebar-nav-item {
|
|
351
|
+
color: rgba(255, 255, 255, 0.75);
|
|
352
|
+
border-radius: 12px;
|
|
353
|
+
padding: 10px 16px;
|
|
354
|
+
transition: all 0.2s ease;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
.sidebar-nav-item:hover {
|
|
358
|
+
background: rgba(255, 255, 255, 0.10);
|
|
359
|
+
color: #ffffff;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
.sidebar-nav-item.active {
|
|
363
|
+
background: rgba(255, 255, 255, 0.18);
|
|
364
|
+
color: #ffffff;
|
|
365
|
+
box-shadow: 0 0 20px rgba(255, 255, 255, 0.08);
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
**Dark Mode:**
|
|
370
|
+
```css
|
|
371
|
+
.dark .sidebar {
|
|
372
|
+
background: linear-gradient(180deg, #1e1b4b 0%, #2e1065 60%, #1e1b4b 100%);
|
|
373
|
+
}
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
- Section labels: Inter Medium 13px, `rgba(255,255,255,0.45)`, UPPERCASE, letterspaced
|
|
377
|
+
- Active indicator: White left border (`border-l-2 border-white`) + translucent white background
|
|
378
|
+
- Logo area: white or light text on the gradient, generous top padding (24px)
|
|
379
|
+
- Bottom user area: separated by `rgba(255,255,255,0.12)` horizontal rule
|
|
380
|
+
|
|
381
|
+
### Buttons
|
|
382
|
+
|
|
383
|
+
All buttons use gradient backgrounds instead of flat colors. The gradient shifts slightly on hover (darker stops) and further on active (darkest stops). This creates a physical depth metaphor -- pressing the button moves it "deeper" into the gradient.
|
|
384
|
+
|
|
385
|
+
**Primary Button:**
|
|
386
|
+
```css
|
|
387
|
+
.btn-primary {
|
|
388
|
+
background: var(--gradient-primary);
|
|
389
|
+
color: #ffffff;
|
|
390
|
+
border: none;
|
|
391
|
+
border-radius: 12px;
|
|
392
|
+
padding: 10px 24px;
|
|
393
|
+
font: 500 14px/1 'Inter', sans-serif;
|
|
394
|
+
letter-spacing: 0.02em;
|
|
395
|
+
box-shadow: 0 2px 8px rgba(79,70,229,0.25);
|
|
396
|
+
transition: all 0.2s ease;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
.btn-primary:hover {
|
|
400
|
+
background: var(--gradient-primary-hover);
|
|
401
|
+
box-shadow: 0 4px 16px rgba(79,70,229,0.35);
|
|
402
|
+
transform: translateY(-1px);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
.btn-primary:active {
|
|
406
|
+
background: var(--gradient-primary-active);
|
|
407
|
+
box-shadow: 0 1px 4px rgba(79,70,229,0.20);
|
|
408
|
+
transform: translateY(0);
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
**Secondary Button:**
|
|
413
|
+
```css
|
|
414
|
+
.btn-secondary {
|
|
415
|
+
background: var(--surface-card);
|
|
416
|
+
color: var(--text-primary);
|
|
417
|
+
border: 1px solid var(--border-strong);
|
|
418
|
+
border-radius: 12px;
|
|
419
|
+
padding: 10px 24px;
|
|
420
|
+
transition: all 0.2s ease;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
.btn-secondary:hover {
|
|
424
|
+
border-color: transparent;
|
|
425
|
+
background:
|
|
426
|
+
linear-gradient(var(--surface-card), var(--surface-card)) padding-box,
|
|
427
|
+
var(--gradient-border-primary) border-box;
|
|
428
|
+
box-shadow: 0 2px 8px rgba(79,70,229,0.10);
|
|
429
|
+
}
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
**Destructive Button:**
|
|
433
|
+
```css
|
|
434
|
+
.btn-destructive {
|
|
435
|
+
background: var(--gradient-warm);
|
|
436
|
+
color: #ffffff;
|
|
437
|
+
border: none;
|
|
438
|
+
border-radius: 12px;
|
|
439
|
+
box-shadow: 0 2px 8px rgba(225,29,72,0.25);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
.btn-destructive:hover {
|
|
443
|
+
background: var(--gradient-warm-hover);
|
|
444
|
+
box-shadow: 0 4px 16px rgba(225,29,72,0.35);
|
|
445
|
+
transform: translateY(-1px);
|
|
446
|
+
}
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
**Ghost Button:**
|
|
450
|
+
```css
|
|
451
|
+
.btn-ghost {
|
|
452
|
+
background: transparent;
|
|
453
|
+
color: var(--text-secondary);
|
|
454
|
+
border: none;
|
|
455
|
+
border-radius: 12px;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.btn-ghost:hover {
|
|
459
|
+
background: var(--gradient-subtle);
|
|
460
|
+
}
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
### Cards
|
|
464
|
+
|
|
465
|
+
Cards use subtle gradient backgrounds and optional gradient borders for featured/highlighted states.
|
|
466
|
+
|
|
467
|
+
**Standard Card:**
|
|
468
|
+
```css
|
|
469
|
+
.card {
|
|
470
|
+
background: var(--gradient-subtle-card);
|
|
471
|
+
border: 1px solid var(--border-default);
|
|
472
|
+
border-radius: 16px;
|
|
473
|
+
box-shadow: 0 4px 12px rgba(79,70,229,0.06);
|
|
474
|
+
padding: 24px;
|
|
475
|
+
transition: all 0.25s ease;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
.card:hover {
|
|
479
|
+
box-shadow: 0 8px 24px rgba(79,70,229,0.10);
|
|
480
|
+
transform: translateY(-2px);
|
|
481
|
+
}
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
**Featured/Accent Card (Gradient Border):**
|
|
485
|
+
```css
|
|
486
|
+
.card-featured {
|
|
487
|
+
border: 2px solid transparent;
|
|
488
|
+
border-radius: 16px;
|
|
489
|
+
background:
|
|
490
|
+
linear-gradient(var(--surface-card), var(--surface-card)) padding-box,
|
|
491
|
+
var(--gradient-border-primary) border-box;
|
|
492
|
+
box-shadow: 0 4px 16px rgba(79,70,229,0.10);
|
|
493
|
+
}
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
**Stat Card (Gradient Header):**
|
|
497
|
+
```css
|
|
498
|
+
.stat-card {
|
|
499
|
+
border-radius: 16px;
|
|
500
|
+
overflow: hidden;
|
|
501
|
+
border: 1px solid var(--border-default);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
.stat-card-header {
|
|
505
|
+
background: var(--gradient-primary);
|
|
506
|
+
color: #ffffff;
|
|
507
|
+
padding: 16px 24px;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
.stat-card-body {
|
|
511
|
+
background: var(--surface-card);
|
|
512
|
+
padding: 24px;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
.stat-card-number {
|
|
516
|
+
font: 700 48px/1 'Plus Jakarta Sans', sans-serif;
|
|
517
|
+
background: var(--gradient-primary-text);
|
|
518
|
+
-webkit-background-clip: text;
|
|
519
|
+
-webkit-text-fill-color: transparent;
|
|
520
|
+
}
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
### Badges / Tags
|
|
524
|
+
|
|
525
|
+
Badges get small, punchy gradients that replace flat background colors. The gradient makes each badge feel like a polished gem.
|
|
526
|
+
|
|
527
|
+
```css
|
|
528
|
+
.badge-primary {
|
|
529
|
+
background: var(--gradient-primary);
|
|
530
|
+
color: #ffffff;
|
|
531
|
+
border-radius: 8px;
|
|
532
|
+
padding: 4px 10px;
|
|
533
|
+
font: 500 12px/1 'Inter', sans-serif;
|
|
534
|
+
letter-spacing: 0.02em;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
.badge-secondary {
|
|
538
|
+
background: var(--gradient-secondary);
|
|
539
|
+
color: #ffffff;
|
|
540
|
+
border-radius: 8px;
|
|
541
|
+
padding: 4px 10px;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
.badge-success {
|
|
545
|
+
background: var(--gradient-success);
|
|
546
|
+
color: #ffffff;
|
|
547
|
+
border-radius: 8px;
|
|
548
|
+
padding: 4px 10px;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
.badge-warning {
|
|
552
|
+
background: var(--gradient-warning);
|
|
553
|
+
color: #ffffff;
|
|
554
|
+
border-radius: 8px;
|
|
555
|
+
padding: 4px 10px;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
.badge-error {
|
|
559
|
+
background: var(--gradient-warm);
|
|
560
|
+
color: #ffffff;
|
|
561
|
+
border-radius: 8px;
|
|
562
|
+
padding: 4px 10px;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
/* Subtle variant for less emphasis */
|
|
566
|
+
.badge-subtle {
|
|
567
|
+
background: var(--gradient-subtle-warm);
|
|
568
|
+
color: var(--text-primary);
|
|
569
|
+
border: 1px solid var(--border-default);
|
|
570
|
+
border-radius: 8px;
|
|
571
|
+
padding: 4px 10px;
|
|
572
|
+
}
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
### Form Inputs
|
|
576
|
+
|
|
577
|
+
Inputs stay neutral at rest but reveal gradient accents on focus -- a subtle reward for interaction.
|
|
578
|
+
|
|
579
|
+
```css
|
|
580
|
+
.input {
|
|
581
|
+
background: var(--surface-card);
|
|
582
|
+
border: 1px solid var(--border-default);
|
|
583
|
+
border-radius: 12px;
|
|
584
|
+
padding: 10px 16px;
|
|
585
|
+
font: 400 16px/1.5 'Inter', sans-serif;
|
|
586
|
+
color: var(--text-primary);
|
|
587
|
+
transition: all 0.2s ease;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
.input::placeholder {
|
|
591
|
+
color: var(--text-muted);
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
/* Gradient focus ring using box-shadow */
|
|
595
|
+
.input:focus {
|
|
596
|
+
outline: none;
|
|
597
|
+
border-color: #6366f1;
|
|
598
|
+
box-shadow:
|
|
599
|
+
0 0 0 3px rgba(99,102,241,0.15),
|
|
600
|
+
0 0 0 1px rgba(99,102,241,0.30);
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/* Alternative: full gradient focus ring */
|
|
604
|
+
.input-gradient-focus:focus {
|
|
605
|
+
outline: none;
|
|
606
|
+
border-color: transparent;
|
|
607
|
+
background:
|
|
608
|
+
linear-gradient(var(--surface-card), var(--surface-card)) padding-box,
|
|
609
|
+
var(--gradient-border-primary) border-box;
|
|
610
|
+
box-shadow: 0 0 0 3px rgba(99,102,241,0.12);
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/* Error state */
|
|
614
|
+
.input-error {
|
|
615
|
+
border-color: #e11d48;
|
|
616
|
+
box-shadow: 0 0 0 3px rgba(225,29,72,0.12);
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
/* Error with gradient */
|
|
620
|
+
.input-error:focus {
|
|
621
|
+
border-color: transparent;
|
|
622
|
+
background:
|
|
623
|
+
linear-gradient(var(--surface-card), var(--surface-card)) padding-box,
|
|
624
|
+
var(--gradient-border-warm) border-box;
|
|
625
|
+
box-shadow: 0 0 0 3px rgba(225,29,72,0.12);
|
|
626
|
+
}
|
|
627
|
+
```
|
|
628
|
+
|
|
629
|
+
- Labels: Inter Medium 13px, UPPERCASE, letterspaced, `text-secondary`
|
|
630
|
+
- Select dropdowns: Same border-radius (12px), gradient focus ring, dropdown panel rounded-2xl
|
|
631
|
+
- Checkbox/Radio: `border-radius: 4px` (checkbox) / `50%` (radio), gradient fill when checked (`background: var(--gradient-primary)`)
|
|
632
|
+
|
|
633
|
+
### Tables / Data Grids
|
|
634
|
+
|
|
635
|
+
Tables get a gradient header row -- the most distinctive table treatment in the theme.
|
|
636
|
+
|
|
637
|
+
```css
|
|
638
|
+
.table {
|
|
639
|
+
border-radius: 16px;
|
|
640
|
+
overflow: hidden;
|
|
641
|
+
border: 1px solid var(--border-default);
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
.table-header {
|
|
645
|
+
background: var(--gradient-primary);
|
|
646
|
+
color: #ffffff;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
.table-header th {
|
|
650
|
+
font: 500 14px/1 'Inter', sans-serif;
|
|
651
|
+
letter-spacing: 0.04em;
|
|
652
|
+
text-transform: uppercase;
|
|
653
|
+
padding: 14px 16px;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
.table-row {
|
|
657
|
+
border-bottom: 1px solid var(--border-default);
|
|
658
|
+
transition: background 0.15s ease;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
.table-row:hover {
|
|
662
|
+
background: var(--gradient-subtle-warm);
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
.table-row td {
|
|
666
|
+
padding: 12px 16px;
|
|
667
|
+
font: 400 14px/1.5 'Inter', sans-serif;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
/* Alternating rows with ultra-subtle gradient */
|
|
671
|
+
.table-row:nth-child(even) {
|
|
672
|
+
background: var(--gradient-subtle);
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
.table-row:nth-child(even):hover {
|
|
676
|
+
background: var(--gradient-subtle-warm);
|
|
677
|
+
}
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
### Progress Bars
|
|
681
|
+
|
|
682
|
+
Gradient progress bars are a natural fit -- the color transition can represent progress itself.
|
|
683
|
+
|
|
684
|
+
```css
|
|
685
|
+
.progress-track {
|
|
686
|
+
background: var(--border-default);
|
|
687
|
+
border-radius: 9999px;
|
|
688
|
+
height: 8px;
|
|
689
|
+
overflow: hidden;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
.progress-fill {
|
|
693
|
+
background: var(--gradient-primary);
|
|
694
|
+
border-radius: 9999px;
|
|
695
|
+
height: 100%;
|
|
696
|
+
transition: width 0.5s ease;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
/* Animated shimmer on progress */
|
|
700
|
+
.progress-fill-animated {
|
|
701
|
+
background: var(--gradient-primary);
|
|
702
|
+
background-size: 200% 100%;
|
|
703
|
+
animation: shimmer 2s linear infinite;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
@keyframes shimmer {
|
|
707
|
+
0% { background-position: 200% 0; }
|
|
708
|
+
100% { background-position: -200% 0; }
|
|
709
|
+
}
|
|
710
|
+
```
|
|
711
|
+
|
|
712
|
+
### Notifications / Toasts
|
|
713
|
+
|
|
714
|
+
```css
|
|
715
|
+
.toast {
|
|
716
|
+
background: var(--surface-card);
|
|
717
|
+
border: 1px solid var(--border-default);
|
|
718
|
+
border-radius: 16px;
|
|
719
|
+
box-shadow: 0 8px 24px rgba(79,70,229,0.12);
|
|
720
|
+
overflow: hidden;
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
/* Gradient left accent bar */
|
|
724
|
+
.toast-success {
|
|
725
|
+
border-left: 3px solid transparent;
|
|
726
|
+
border-image: var(--gradient-success) 1;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
/* Alternative: top gradient bar */
|
|
730
|
+
.toast-top-bar::before {
|
|
731
|
+
content: '';
|
|
732
|
+
display: block;
|
|
733
|
+
height: 3px;
|
|
734
|
+
background: var(--gradient-primary);
|
|
735
|
+
}
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
### Modals / Dialogs
|
|
739
|
+
|
|
740
|
+
```css
|
|
741
|
+
.modal {
|
|
742
|
+
background: var(--surface-card);
|
|
743
|
+
border-radius: 24px;
|
|
744
|
+
box-shadow: 0 12px 40px rgba(79,70,229,0.15);
|
|
745
|
+
border: 1px solid var(--border-default);
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
.modal-header {
|
|
749
|
+
padding: 24px 24px 16px;
|
|
750
|
+
border-bottom: 1px solid var(--border-default);
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
/* Optional: gradient top accent on modal */
|
|
754
|
+
.modal-gradient-accent::before {
|
|
755
|
+
content: '';
|
|
756
|
+
display: block;
|
|
757
|
+
height: 4px;
|
|
758
|
+
background: var(--gradient-primary);
|
|
759
|
+
border-radius: 24px 24px 0 0;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
.modal-overlay {
|
|
763
|
+
background: rgba(15,23,42,0.60);
|
|
764
|
+
backdrop-filter: blur(8px);
|
|
765
|
+
}
|
|
766
|
+
```
|
|
767
|
+
|
|
768
|
+
### Pagination
|
|
769
|
+
|
|
770
|
+
```css
|
|
771
|
+
.pagination-btn {
|
|
772
|
+
border-radius: 12px;
|
|
773
|
+
padding: 8px 14px;
|
|
774
|
+
border: 1px solid var(--border-default);
|
|
775
|
+
transition: all 0.2s ease;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
.pagination-btn.active {
|
|
779
|
+
background: var(--gradient-primary);
|
|
780
|
+
color: #ffffff;
|
|
781
|
+
border-color: transparent;
|
|
782
|
+
box-shadow: 0 2px 8px rgba(79,70,229,0.25);
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
.pagination-btn:hover:not(.active) {
|
|
786
|
+
background: var(--gradient-subtle-warm);
|
|
787
|
+
border-color: var(--border-strong);
|
|
788
|
+
}
|
|
789
|
+
```
|
|
790
|
+
|
|
791
|
+
---
|
|
792
|
+
|
|
793
|
+
## Mesh / Aurora Background
|
|
794
|
+
|
|
795
|
+
The page background gets a subtle mesh gradient overlay -- multiple overlapping radial gradients that create a soft, organic, aurora-like atmosphere. This is the ambient gradient layer that ties the entire theme together.
|
|
796
|
+
|
|
797
|
+
### Implementation
|
|
798
|
+
|
|
799
|
+
```css
|
|
800
|
+
.page-background {
|
|
801
|
+
background-color: var(--surface-page);
|
|
802
|
+
position: relative;
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
.page-background::before {
|
|
806
|
+
content: '';
|
|
807
|
+
position: fixed;
|
|
808
|
+
inset: 0;
|
|
809
|
+
pointer-events: none;
|
|
810
|
+
z-index: 0;
|
|
811
|
+
background:
|
|
812
|
+
radial-gradient(ellipse 80% 50% at 20% -10%, rgba(99,102,241,0.12) 0%, transparent 60%),
|
|
813
|
+
radial-gradient(ellipse 60% 40% at 80% 10%, rgba(139,92,246,0.08) 0%, transparent 55%),
|
|
814
|
+
radial-gradient(ellipse 70% 50% at 50% 100%, rgba(6,182,212,0.06) 0%, transparent 50%);
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
/* Dark mode: more vibrant aurora */
|
|
818
|
+
.dark .page-background::before {
|
|
819
|
+
background:
|
|
820
|
+
radial-gradient(ellipse 80% 50% at 20% -10%, rgba(99,102,241,0.18) 0%, transparent 60%),
|
|
821
|
+
radial-gradient(ellipse 60% 40% at 80% 10%, rgba(139,92,246,0.14) 0%, transparent 55%),
|
|
822
|
+
radial-gradient(ellipse 70% 50% at 50% 100%, rgba(6,182,212,0.10) 0%, transparent 50%);
|
|
823
|
+
}
|
|
824
|
+
```
|
|
825
|
+
|
|
826
|
+
### Sidebar Aurora (Alternative)
|
|
827
|
+
|
|
828
|
+
If the sidebar uses a gradient background, an additional aurora layer can add depth:
|
|
829
|
+
|
|
830
|
+
```css
|
|
831
|
+
.sidebar::after {
|
|
832
|
+
content: '';
|
|
833
|
+
position: absolute;
|
|
834
|
+
inset: 0;
|
|
835
|
+
pointer-events: none;
|
|
836
|
+
background:
|
|
837
|
+
radial-gradient(ellipse at 30% 0%, rgba(255,255,255,0.08) 0%, transparent 50%),
|
|
838
|
+
radial-gradient(ellipse at 70% 100%, rgba(6,182,212,0.12) 0%, transparent 50%);
|
|
839
|
+
}
|
|
840
|
+
```
|
|
841
|
+
|
|
842
|
+
### Performance Note
|
|
843
|
+
|
|
844
|
+
The mesh gradient uses `position: fixed` and `pointer-events: none` to avoid layout thrashing. No animations on the mesh layer -- it is static. If an animated aurora is desired, use `will-change: transform` and animate `transform: rotate()` on individual radial-gradient layers via pseudo-elements, but this adds GPU cost. Default: static.
|
|
845
|
+
|
|
846
|
+
---
|
|
847
|
+
|
|
848
|
+
## Light and Dark Mode
|
|
849
|
+
|
|
850
|
+
### Light Mode
|
|
851
|
+
|
|
852
|
+
- **Softer, pastel-leaning gradients**: The primary gradient uses full-saturation indigo/violet stops. The subtle gradients are barely-there shifts between slate-50 and slate-100.
|
|
853
|
+
- **Aurora layer**: Very low opacity (6-12%) -- a gentle wash of color on the page background.
|
|
854
|
+
- **Shadows**: Tinted with `rgba(79,70,229, 0.06-0.15)` -- violet-tinted shadows that feel cohesive with the gradient system.
|
|
855
|
+
- **Text**: Dark text on light backgrounds. Gradient text only on hero stats/numbers.
|
|
856
|
+
- **Buttons**: Full-saturation gradients on primary actions. Clean, high contrast.
|
|
857
|
+
- **Cards**: White-to-slate-50 subtle vertical gradient. Barely perceptible but adds life.
|
|
858
|
+
|
|
859
|
+
### Dark Mode
|
|
860
|
+
|
|
861
|
+
- **More saturated, deeper gradients**: Stops shift to the -700/-800 range. The reduced lightness allows more saturation without feeling garish.
|
|
862
|
+
- **Aurora layer**: Higher opacity (10-18%) -- gradients glow more in darkness, like actual aurora borealis.
|
|
863
|
+
- **Shadows**: Deeper tint, higher opacity. `rgba(79,70,229, 0.12-0.25)`.
|
|
864
|
+
- **Text**: Light text. Gradient text uses lighter stops (indigo-400 to violet-300) for readability.
|
|
865
|
+
- **Buttons**: Slightly desaturated gradient stops to avoid being blinding. The darker hover/active states provide clear state differentiation.
|
|
866
|
+
- **Cards**: `slate-900` to `slate-950` subtle gradient. Just enough to prevent that flat, dead look dark UIs can have.
|
|
867
|
+
- **Sidebar**: Deep indigo background (`#1e1b4b`) with a barely-visible gradient shift to violet-950. The aurora overlay layer glows softly.
|
|
868
|
+
- **Gradient borders**: Slightly brighter than light mode to maintain visibility against dark backgrounds.
|
|
869
|
+
|
|
870
|
+
### Mode Transition
|
|
871
|
+
|
|
872
|
+
```css
|
|
873
|
+
/* Smooth theme transition (prevents harsh flash) */
|
|
874
|
+
* {
|
|
875
|
+
transition: background-color 0.3s ease, border-color 0.3s ease, box-shadow 0.3s ease;
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
/* Exclude gradient transitions (they don't animate well) */
|
|
879
|
+
[class*="btn-"], .badge, .sidebar, .table-header, .progress-fill {
|
|
880
|
+
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
|
881
|
+
}
|
|
882
|
+
```
|
|
883
|
+
|
|
884
|
+
---
|
|
885
|
+
|
|
886
|
+
## Spacing & Layout
|
|
887
|
+
|
|
888
|
+
| Aspect | Value | Tailwind | Notes |
|
|
889
|
+
|----------------------|-------------|-------------|------------------------------------------|
|
|
890
|
+
| Page padding | 24px | `p-6` | Moderate, content-focused |
|
|
891
|
+
| Card gap | 24px | `gap-6` | Comfortable grid spacing |
|
|
892
|
+
| Card inner padding | 24px | `p-6` | Generous but not wasteful |
|
|
893
|
+
| Section gap | 40px | `mt-10` | Clear section separation |
|
|
894
|
+
| Sidebar width | 260px | `w-[260px]` | Standard admin width |
|
|
895
|
+
| Content max-width | 1400px | `max-w-7xl` | Wide content area |
|
|
896
|
+
| Grid columns | 12-column | -- | Standard responsive grid |
|
|
897
|
+
| Border radius | 12-16px | `rounded-xl` to `rounded-2xl` | Generous, flowing |
|
|
898
|
+
|
|
899
|
+
---
|
|
900
|
+
|
|
901
|
+
## Mood & Inspiration
|
|
902
|
+
|
|
903
|
+
### Visual Identity Keywords
|
|
904
|
+
|
|
905
|
+
Flowing, luminous, liquid, modern, premium, smooth, vibrant-yet-restrained, tech-forward, polished, immersive
|
|
906
|
+
|
|
907
|
+
### What Makes This Theme Different
|
|
908
|
+
|
|
909
|
+
| Aspect | Typical Admin Theme | Gradient Flow |
|
|
910
|
+
|--------------------------|-----------------------------|-----------------------------------------|
|
|
911
|
+
| **Sidebar** | Flat dark background | Vertical gradient (indigo to violet) |
|
|
912
|
+
| **Buttons** | Flat color | Diagonal gradient + gradient hover |
|
|
913
|
+
| **Card borders** | Solid color or none | Gradient border (background-clip) |
|
|
914
|
+
| **Badges** | Flat pastel or solid | Small, punchy gradient fills |
|
|
915
|
+
| **Table header** | Flat grey or dark | Full gradient bar |
|
|
916
|
+
| **Focus rings** | Solid color outline | Gradient border + soft glow |
|
|
917
|
+
| **Page background** | Flat white/grey | Mesh aurora gradient overlay |
|
|
918
|
+
| **Progress bars** | Flat color fill | Gradient fill with optional shimmer |
|
|
919
|
+
| **Shadows** | Neutral grey | Gradient-tinted (violet wash) |
|
|
920
|
+
| **Dark mode** | Desaturated, flat | More vibrant gradients, glowing aurora |
|
|
921
|
+
|
|
922
|
+
### Inspiration References
|
|
923
|
+
|
|
924
|
+
- **Apple (iOS/macOS)** -- App icon gradients, the Weather app's dynamic gradients, macOS Sonoma wallpapers. Apple proves gradients can be premium and not gimmicky when the color stops are carefully chosen and the transitions are smooth. Their approach: bold gradients on small surfaces (icons, buttons), subtle gradients on large surfaces (backgrounds).
|
|
925
|
+
|
|
926
|
+
- **Stripe** -- The subtle blue-to-indigo gradient on their hero sections, the gradient meshes on their product pages. Stripe taught the web industry that gradients convey trust and sophistication when the color palette stays cool and the transitions stay smooth. Their key technique: gradients that flow in one consistent direction.
|
|
927
|
+
|
|
928
|
+
- **Vercel** -- Text gradient effects, the subtle dark gradient backgrounds on their dashboard. Vercel keeps gradients minimal but impactful -- a single gradient text heading can anchor an entire page. Their key lesson: gradient text should be rare and large to be effective.
|
|
929
|
+
|
|
930
|
+
- **Linear** -- The app uses subtle gradient accents throughout a clean interface -- gradient issue labels, gradient progress indicators, gradient hover states. Linear proves that a gradient-heavy interface can still feel professional and fast.
|
|
931
|
+
|
|
932
|
+
- **Raycast** -- Their command palette and extension icons use thoughtful gradients on dark backgrounds. The combination of gradient accent + dark UI + generous border-radius is exactly the Gradient Flow dark mode aesthetic.
|
|
933
|
+
|
|
934
|
+
---
|
|
935
|
+
|
|
936
|
+
## NuxtUI 4 Configuration Hint
|
|
937
|
+
|
|
938
|
+
```typescript
|
|
939
|
+
// In app.config.ts
|
|
940
|
+
export default defineAppConfig({
|
|
941
|
+
ui: {
|
|
942
|
+
colors: {
|
|
943
|
+
primary: 'indigo',
|
|
944
|
+
secondary: 'teal',
|
|
945
|
+
neutral: 'slate'
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
})
|
|
949
|
+
```
|
|
950
|
+
|
|
951
|
+
### Tailwind CSS Classes (Reference)
|
|
952
|
+
|
|
953
|
+
```html
|
|
954
|
+
<!-- Primary gradient button -->
|
|
955
|
+
<button class="bg-gradient-to-br from-indigo-600 to-violet-500 text-white rounded-xl px-6 py-2.5
|
|
956
|
+
hover:from-indigo-700 hover:to-violet-600 shadow-md shadow-indigo-500/20
|
|
957
|
+
transition-all hover:-translate-y-0.5">
|
|
958
|
+
Save Changes
|
|
959
|
+
</button>
|
|
960
|
+
|
|
961
|
+
<!-- Gradient border card -->
|
|
962
|
+
<div class="rounded-2xl border-2 border-transparent bg-gradient-to-br from-indigo-500 to-violet-500 p-[1px]">
|
|
963
|
+
<div class="rounded-[14px] bg-white dark:bg-slate-900 p-6">
|
|
964
|
+
Card content
|
|
965
|
+
</div>
|
|
966
|
+
</div>
|
|
967
|
+
|
|
968
|
+
<!-- Gradient badge -->
|
|
969
|
+
<span class="bg-gradient-to-r from-teal-600 to-cyan-500 text-white text-xs font-medium px-2.5 py-1 rounded-lg">
|
|
970
|
+
Active
|
|
971
|
+
</span>
|
|
972
|
+
|
|
973
|
+
<!-- Gradient sidebar -->
|
|
974
|
+
<aside class="bg-gradient-to-b from-indigo-600 via-violet-600 to-violet-500 text-white w-[260px]">
|
|
975
|
+
<!-- nav items -->
|
|
976
|
+
</aside>
|
|
977
|
+
|
|
978
|
+
<!-- Gradient table header -->
|
|
979
|
+
<thead class="bg-gradient-to-r from-indigo-600 to-violet-500 text-white">
|
|
980
|
+
<tr>...</tr>
|
|
981
|
+
</thead>
|
|
982
|
+
|
|
983
|
+
<!-- Aurora page background -->
|
|
984
|
+
<div class="relative bg-slate-50 dark:bg-slate-950">
|
|
985
|
+
<div class="fixed inset-0 pointer-events-none
|
|
986
|
+
bg-[radial-gradient(ellipse_80%_50%_at_20%_-10%,rgba(99,102,241,0.12),transparent_60%),
|
|
987
|
+
radial-gradient(ellipse_60%_40%_at_80%_10%,rgba(139,92,246,0.08),transparent_55%),
|
|
988
|
+
radial-gradient(ellipse_70%_50%_at_50%_100%,rgba(6,182,212,0.06),transparent_50%)]">
|
|
989
|
+
</div>
|
|
990
|
+
<!-- page content with relative z-10 -->
|
|
991
|
+
</div>
|
|
992
|
+
|
|
993
|
+
<!-- Gradient text (hero stat) -->
|
|
994
|
+
<span class="bg-gradient-to-r from-indigo-500 to-violet-400 bg-clip-text text-transparent text-5xl font-bold">
|
|
995
|
+
2,847
|
|
996
|
+
</span>
|
|
997
|
+
|
|
998
|
+
<!-- Gradient focus input -->
|
|
999
|
+
<input class="rounded-xl border border-slate-200 px-4 py-2.5
|
|
1000
|
+
focus:border-transparent focus:ring-2 focus:ring-indigo-500/20
|
|
1001
|
+
focus:[background:linear-gradient(white,white)_padding-box,linear-gradient(135deg,#4f46e5,#8b5cf6)_border-box]
|
|
1002
|
+
dark:bg-slate-900 dark:border-slate-700" />
|
|
1003
|
+
```
|
|
1004
|
+
|
|
1005
|
+
### Custom CSS Required
|
|
1006
|
+
|
|
1007
|
+
```css
|
|
1008
|
+
/* Gradient Flow theme utilities */
|
|
1009
|
+
|
|
1010
|
+
/* Gradient text helper */
|
|
1011
|
+
.text-gradient {
|
|
1012
|
+
background: linear-gradient(135deg, #6366f1, #a78bfa);
|
|
1013
|
+
-webkit-background-clip: text;
|
|
1014
|
+
-webkit-text-fill-color: transparent;
|
|
1015
|
+
background-clip: text;
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
.dark .text-gradient {
|
|
1019
|
+
background: linear-gradient(135deg, #818cf8, #c4b5fd);
|
|
1020
|
+
-webkit-background-clip: text;
|
|
1021
|
+
-webkit-text-fill-color: transparent;
|
|
1022
|
+
background-clip: text;
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
/* Gradient border helper */
|
|
1026
|
+
.border-gradient {
|
|
1027
|
+
border: 2px solid transparent;
|
|
1028
|
+
background:
|
|
1029
|
+
linear-gradient(var(--surface-card), var(--surface-card)) padding-box,
|
|
1030
|
+
linear-gradient(135deg, #4f46e5, #8b5cf6) border-box;
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
/* Gradient glow shadow */
|
|
1034
|
+
.shadow-glow-primary {
|
|
1035
|
+
box-shadow: 0 0 20px rgba(99,102,241,0.25);
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
.shadow-glow-secondary {
|
|
1039
|
+
box-shadow: 0 0 20px rgba(13,148,136,0.25);
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
/* Shimmer animation for progress bars */
|
|
1043
|
+
@keyframes gradient-shimmer {
|
|
1044
|
+
0% { background-position: 200% 0; }
|
|
1045
|
+
100% { background-position: -200% 0; }
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
.animate-shimmer {
|
|
1049
|
+
background-size: 200% 100%;
|
|
1050
|
+
animation: gradient-shimmer 2s linear infinite;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
/* Smooth mode transitions */
|
|
1054
|
+
.theme-transition * {
|
|
1055
|
+
transition: background-color 0.3s ease, border-color 0.3s ease, color 0.3s ease;
|
|
1056
|
+
}
|
|
1057
|
+
```
|