@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,779 @@
|
|
|
1
|
+
# Neon Terminal Theme Spec
|
|
2
|
+
|
|
3
|
+
**Theme ID:** `neon-terminal`
|
|
4
|
+
**Direction:** Dark-mode-first, dev-tool-inspired admin panel with neon accents, monospace touches, and cyberpunk energy.
|
|
5
|
+
**Vibe:** Warp terminal meets cyberpunk dashboard. A hacker's command center that takes itself seriously but isn't afraid to glow.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Color Palette
|
|
10
|
+
|
|
11
|
+
A near-black void background punctuated by aggressive neon accents. Inspired by Warp terminal themes, Cyberpunk 2077 UI, and Linear's dark mode elevation system.
|
|
12
|
+
|
|
13
|
+
### Base / Background Scale
|
|
14
|
+
|
|
15
|
+
| Token | Hex | Usage |
|
|
16
|
+
|-------------------|-----------|---------------------------------------------|
|
|
17
|
+
| `void` | `#07080A` | Page background, deepest layer |
|
|
18
|
+
| `surface-0` | `#0D0F14` | Card backgrounds, sidebar |
|
|
19
|
+
| `surface-1` | `#13161D` | Elevated cards, dropdowns, modals |
|
|
20
|
+
| `surface-2` | `#1A1E27` | Hover states, active sidebar items |
|
|
21
|
+
| `surface-3` | `#242832` | Borders, dividers, subtle separators |
|
|
22
|
+
|
|
23
|
+
### Neon Accent Scale
|
|
24
|
+
|
|
25
|
+
| Token | Hex | Tailwind | Usage |
|
|
26
|
+
|-------------------|-----------|----------------|--------------------------------------|
|
|
27
|
+
| `neon-cyan` | `#00FFEE` | `cyan-300` | Primary actions, links, focus rings |
|
|
28
|
+
| `neon-cyan-muted` | `#0ABDC6` | `cyan-500` | Secondary text accents, badges |
|
|
29
|
+
| `neon-magenta` | `#FF00AA` | `pink-500` | Destructive/danger, critical alerts |
|
|
30
|
+
| `neon-green` | `#39FF14` | `green-400` | Success states, online indicators |
|
|
31
|
+
| `neon-yellow` | `#FFE600` | `yellow-300` | Warnings, pending states |
|
|
32
|
+
| `neon-purple` | `#BD00FF` | `purple-500` | Info badges, secondary accents |
|
|
33
|
+
|
|
34
|
+
### Text Scale
|
|
35
|
+
|
|
36
|
+
| Token | Hex | Usage |
|
|
37
|
+
|-------------------|-----------|---------------------------------------------|
|
|
38
|
+
| `text-primary` | `#E8ECF1` | Primary text (slightly warm white) |
|
|
39
|
+
| `text-secondary` | `#8B95A5` | Secondary text, labels, placeholders |
|
|
40
|
+
| `text-muted` | `#4A5568` | Disabled text, timestamps |
|
|
41
|
+
| `text-neon` | `#00FFEE` | Highlighted text, active nav items |
|
|
42
|
+
|
|
43
|
+
### Semantic Colors
|
|
44
|
+
|
|
45
|
+
| Token | Hex | Usage |
|
|
46
|
+
|-------------------|-----------|---------------------------------------------|
|
|
47
|
+
| `success` | `#39FF14` | Success toasts, completed states |
|
|
48
|
+
| `warning` | `#FFE600` | Warning toasts, caution states |
|
|
49
|
+
| `error` | `#FF00AA` | Error toasts, validation failures |
|
|
50
|
+
| `info` | `#BD00FF` | Informational toasts, tips |
|
|
51
|
+
|
|
52
|
+
### CSS Custom Properties
|
|
53
|
+
|
|
54
|
+
```css
|
|
55
|
+
:root {
|
|
56
|
+
--neon-void: #07080A;
|
|
57
|
+
--neon-surface-0: #0D0F14;
|
|
58
|
+
--neon-surface-1: #13161D;
|
|
59
|
+
--neon-surface-2: #1A1E27;
|
|
60
|
+
--neon-surface-3: #242832;
|
|
61
|
+
|
|
62
|
+
--neon-cyan: #00FFEE;
|
|
63
|
+
--neon-cyan-muted: #0ABDC6;
|
|
64
|
+
--neon-magenta: #FF00AA;
|
|
65
|
+
--neon-green: #39FF14;
|
|
66
|
+
--neon-yellow: #FFE600;
|
|
67
|
+
--neon-purple: #BD00FF;
|
|
68
|
+
|
|
69
|
+
--neon-text-primary: #E8ECF1;
|
|
70
|
+
--neon-text-secondary: #8B95A5;
|
|
71
|
+
--neon-text-muted: #4A5568;
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 2. Typography
|
|
78
|
+
|
|
79
|
+
### Font Pairing
|
|
80
|
+
|
|
81
|
+
**Headings:** JetBrains Mono (monospace, bold weight)
|
|
82
|
+
**Body:** IBM Plex Sans (clean, technical sans-serif)
|
|
83
|
+
**Code / Badges / Labels:** JetBrains Mono (monospace, regular weight)
|
|
84
|
+
|
|
85
|
+
This pairing creates maximum terminal energy in headings while keeping body text highly readable. Both fonts were designed for UI contexts and share a technical DNA.
|
|
86
|
+
|
|
87
|
+
### Google Fonts URL
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700;800&display=swap
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Type Scale (Large and Bold)
|
|
94
|
+
|
|
95
|
+
| Element | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|
|
96
|
+
|--------------------|------------------|----------|--------|-------------|----------------|---------------------------------------------|
|
|
97
|
+
| Page Title (h1) | JetBrains Mono | `40px` | 800 | 1.1 | `-0.03em` | UPPERCASE, neon-cyan glow on dark bg |
|
|
98
|
+
| Section Title (h2) | JetBrains Mono | `28px` | 700 | 1.2 | `-0.02em` | Title case |
|
|
99
|
+
| Card Title (h3) | JetBrains Mono | `20px` | 600 | 1.3 | `-0.01em` | |
|
|
100
|
+
| Body | IBM Plex Sans | `15px` | 400 | 1.6 | `0` | |
|
|
101
|
+
| Body Small | IBM Plex Sans | `13px` | 400 | 1.5 | `0.01em` | |
|
|
102
|
+
| Label | JetBrains Mono | `11px` | 600 | 1.4 | `0.08em` | UPPERCASE, neon-cyan-muted color |
|
|
103
|
+
| Badge | JetBrains Mono | `11px` | 500 | 1 | `0.05em` | UPPERCASE |
|
|
104
|
+
| Code | JetBrains Mono | `13px` | 400 | 1.5 | `0` | Inline code snippets |
|
|
105
|
+
| Nav Item | JetBrains Mono | `13px` | 500 | 1.4 | `0.02em` | Sidebar navigation |
|
|
106
|
+
|
|
107
|
+
### CSS
|
|
108
|
+
|
|
109
|
+
```css
|
|
110
|
+
.neon-h1 {
|
|
111
|
+
font-family: 'JetBrains Mono', monospace;
|
|
112
|
+
font-size: 40px;
|
|
113
|
+
font-weight: 800;
|
|
114
|
+
line-height: 1.1;
|
|
115
|
+
letter-spacing: -0.03em;
|
|
116
|
+
text-transform: uppercase;
|
|
117
|
+
color: var(--neon-cyan);
|
|
118
|
+
text-shadow:
|
|
119
|
+
0 0 7px rgba(0, 255, 238, 0.6),
|
|
120
|
+
0 0 20px rgba(0, 255, 238, 0.3),
|
|
121
|
+
0 0 42px rgba(0, 255, 238, 0.15);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.neon-h2 {
|
|
125
|
+
font-family: 'JetBrains Mono', monospace;
|
|
126
|
+
font-size: 28px;
|
|
127
|
+
font-weight: 700;
|
|
128
|
+
line-height: 1.2;
|
|
129
|
+
letter-spacing: -0.02em;
|
|
130
|
+
color: var(--neon-text-primary);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.neon-body {
|
|
134
|
+
font-family: 'IBM Plex Sans', sans-serif;
|
|
135
|
+
font-size: 15px;
|
|
136
|
+
font-weight: 400;
|
|
137
|
+
line-height: 1.6;
|
|
138
|
+
color: var(--neon-text-primary);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.neon-label {
|
|
142
|
+
font-family: 'JetBrains Mono', monospace;
|
|
143
|
+
font-size: 11px;
|
|
144
|
+
font-weight: 600;
|
|
145
|
+
line-height: 1.4;
|
|
146
|
+
letter-spacing: 0.08em;
|
|
147
|
+
text-transform: uppercase;
|
|
148
|
+
color: var(--neon-cyan-muted);
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## 3. Shape Language
|
|
155
|
+
|
|
156
|
+
A deliberate tension between **razor-sharp containers** and **pill-shaped interactive elements**. Cards and panels are angular and industrial. Buttons and badges are smooth and futuristic.
|
|
157
|
+
|
|
158
|
+
### Border Radius Tokens
|
|
159
|
+
|
|
160
|
+
| Token | Value | Usage |
|
|
161
|
+
|--------------------|----------|---------------------------------------------|
|
|
162
|
+
| `radius-none` | `0px` | Cards, panels, modal containers, tables |
|
|
163
|
+
| `radius-sm` | `2px` | Input fields, code blocks |
|
|
164
|
+
| `radius-pill` | `9999px` | Buttons, badges, pills, tags, toggles |
|
|
165
|
+
| `radius-circle` | `50%` | Avatars, status indicators |
|
|
166
|
+
|
|
167
|
+
### Design Rules
|
|
168
|
+
|
|
169
|
+
1. **Cards / Panels / Modals:** `border-radius: 0px` -- Hard, sharp corners. Industrial. Zero softness.
|
|
170
|
+
2. **Buttons:** `border-radius: 9999px` -- Full pill shape. Futuristic contrast against sharp containers.
|
|
171
|
+
3. **Input fields:** `border-radius: 2px` -- Almost sharp, terminal-like.
|
|
172
|
+
4. **Badges / Tags:** `border-radius: 9999px` -- Pill-shaped, floating over dark surfaces.
|
|
173
|
+
5. **Avatars:** `border-radius: 50%` -- Classic circle.
|
|
174
|
+
6. **Dropdown menus:** `border-radius: 0px` -- Sharp to match card containers.
|
|
175
|
+
7. **Sidebar:** Sharp corners everywhere, items have no radius.
|
|
176
|
+
|
|
177
|
+
### Corner Cut Effect (Optional Enhancement)
|
|
178
|
+
|
|
179
|
+
For extra cyberpunk energy, key containers can use a CSS clip-path to create an angled corner cut:
|
|
180
|
+
|
|
181
|
+
```css
|
|
182
|
+
.neon-card-cut {
|
|
183
|
+
clip-path: polygon(
|
|
184
|
+
0 0,
|
|
185
|
+
calc(100% - 16px) 0,
|
|
186
|
+
100% 16px,
|
|
187
|
+
100% 100%,
|
|
188
|
+
16px 100%,
|
|
189
|
+
0 calc(100% - 16px)
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
This creates a chamfered/beveled look where the top-right and bottom-left corners are cut at 45 degrees -- a signature cyberpunk detail.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 4. Component Styling
|
|
199
|
+
|
|
200
|
+
### Buttons
|
|
201
|
+
|
|
202
|
+
```css
|
|
203
|
+
/* Primary Button */
|
|
204
|
+
.neon-btn-primary {
|
|
205
|
+
font-family: 'JetBrains Mono', monospace;
|
|
206
|
+
font-size: 13px;
|
|
207
|
+
font-weight: 600;
|
|
208
|
+
letter-spacing: 0.05em;
|
|
209
|
+
text-transform: uppercase;
|
|
210
|
+
color: var(--neon-void);
|
|
211
|
+
background: var(--neon-cyan);
|
|
212
|
+
border: none;
|
|
213
|
+
border-radius: 9999px;
|
|
214
|
+
padding: 10px 28px;
|
|
215
|
+
cursor: pointer;
|
|
216
|
+
transition: all 0.2s ease;
|
|
217
|
+
box-shadow:
|
|
218
|
+
0 0 5px rgba(0, 255, 238, 0.4),
|
|
219
|
+
0 0 20px rgba(0, 255, 238, 0.15);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.neon-btn-primary:hover {
|
|
223
|
+
box-shadow:
|
|
224
|
+
0 0 8px rgba(0, 255, 238, 0.6),
|
|
225
|
+
0 0 30px rgba(0, 255, 238, 0.3),
|
|
226
|
+
0 0 60px rgba(0, 255, 238, 0.1);
|
|
227
|
+
transform: translateY(-1px);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.neon-btn-primary:active {
|
|
231
|
+
transform: translateY(0);
|
|
232
|
+
box-shadow: 0 0 5px rgba(0, 255, 238, 0.4);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/* Ghost / Outline Button */
|
|
236
|
+
.neon-btn-ghost {
|
|
237
|
+
font-family: 'JetBrains Mono', monospace;
|
|
238
|
+
font-size: 13px;
|
|
239
|
+
font-weight: 500;
|
|
240
|
+
letter-spacing: 0.05em;
|
|
241
|
+
text-transform: uppercase;
|
|
242
|
+
color: var(--neon-cyan);
|
|
243
|
+
background: transparent;
|
|
244
|
+
border: 1px solid var(--neon-surface-3);
|
|
245
|
+
border-radius: 9999px;
|
|
246
|
+
padding: 10px 28px;
|
|
247
|
+
cursor: pointer;
|
|
248
|
+
transition: all 0.2s ease;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.neon-btn-ghost:hover {
|
|
252
|
+
border-color: var(--neon-cyan);
|
|
253
|
+
box-shadow: 0 0 10px rgba(0, 255, 238, 0.2);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/* Danger Button */
|
|
257
|
+
.neon-btn-danger {
|
|
258
|
+
color: var(--neon-void);
|
|
259
|
+
background: var(--neon-magenta);
|
|
260
|
+
border-radius: 9999px;
|
|
261
|
+
box-shadow:
|
|
262
|
+
0 0 5px rgba(255, 0, 170, 0.4),
|
|
263
|
+
0 0 20px rgba(255, 0, 170, 0.15);
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Input Fields (Terminal Style)
|
|
268
|
+
|
|
269
|
+
```css
|
|
270
|
+
.neon-input {
|
|
271
|
+
font-family: 'JetBrains Mono', monospace;
|
|
272
|
+
font-size: 14px;
|
|
273
|
+
color: var(--neon-text-primary);
|
|
274
|
+
background: var(--neon-void);
|
|
275
|
+
border: 1px solid var(--neon-surface-3);
|
|
276
|
+
border-radius: 2px;
|
|
277
|
+
padding: 12px 16px;
|
|
278
|
+
transition: all 0.2s ease;
|
|
279
|
+
caret-color: var(--neon-cyan);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.neon-input::placeholder {
|
|
283
|
+
color: var(--neon-text-muted);
|
|
284
|
+
font-style: italic;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
.neon-input:focus {
|
|
288
|
+
outline: none;
|
|
289
|
+
border-color: var(--neon-cyan);
|
|
290
|
+
box-shadow:
|
|
291
|
+
0 0 0 1px var(--neon-cyan),
|
|
292
|
+
0 0 15px rgba(0, 255, 238, 0.15);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.neon-input:focus::before {
|
|
296
|
+
/* Optional: blinking cursor prefix like a terminal prompt */
|
|
297
|
+
content: '> ';
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/* Input with prompt prefix */
|
|
301
|
+
.neon-input-prompted {
|
|
302
|
+
padding-left: 32px;
|
|
303
|
+
position: relative;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
.neon-input-prompted::before {
|
|
307
|
+
content: '>';
|
|
308
|
+
position: absolute;
|
|
309
|
+
left: 12px;
|
|
310
|
+
color: var(--neon-cyan);
|
|
311
|
+
font-family: 'JetBrains Mono', monospace;
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### Cards
|
|
316
|
+
|
|
317
|
+
```css
|
|
318
|
+
.neon-card {
|
|
319
|
+
background: var(--neon-surface-0);
|
|
320
|
+
border: 1px solid var(--neon-surface-3);
|
|
321
|
+
border-radius: 0px;
|
|
322
|
+
padding: 24px;
|
|
323
|
+
position: relative;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/* Card with top accent line */
|
|
327
|
+
.neon-card-accent {
|
|
328
|
+
border-top: 2px solid var(--neon-cyan);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/* Card with full glow on hover */
|
|
332
|
+
.neon-card:hover {
|
|
333
|
+
border-color: rgba(0, 255, 238, 0.3);
|
|
334
|
+
box-shadow: 0 0 20px rgba(0, 255, 238, 0.05);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/* Stat card with large number */
|
|
338
|
+
.neon-stat-card {
|
|
339
|
+
background: var(--neon-surface-0);
|
|
340
|
+
border: 1px solid var(--neon-surface-3);
|
|
341
|
+
border-radius: 0px;
|
|
342
|
+
padding: 28px;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
.neon-stat-value {
|
|
346
|
+
font-family: 'JetBrains Mono', monospace;
|
|
347
|
+
font-size: 48px;
|
|
348
|
+
font-weight: 800;
|
|
349
|
+
color: var(--neon-cyan);
|
|
350
|
+
text-shadow: 0 0 20px rgba(0, 255, 238, 0.3);
|
|
351
|
+
line-height: 1;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
.neon-stat-label {
|
|
355
|
+
font-family: 'JetBrains Mono', monospace;
|
|
356
|
+
font-size: 11px;
|
|
357
|
+
font-weight: 600;
|
|
358
|
+
letter-spacing: 0.08em;
|
|
359
|
+
text-transform: uppercase;
|
|
360
|
+
color: var(--neon-text-muted);
|
|
361
|
+
margin-top: 8px;
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Badges / Tags
|
|
366
|
+
|
|
367
|
+
```css
|
|
368
|
+
.neon-badge {
|
|
369
|
+
font-family: 'JetBrains Mono', monospace;
|
|
370
|
+
font-size: 11px;
|
|
371
|
+
font-weight: 500;
|
|
372
|
+
letter-spacing: 0.05em;
|
|
373
|
+
text-transform: uppercase;
|
|
374
|
+
padding: 4px 12px;
|
|
375
|
+
border-radius: 9999px;
|
|
376
|
+
display: inline-flex;
|
|
377
|
+
align-items: center;
|
|
378
|
+
gap: 6px;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
.neon-badge-cyan {
|
|
382
|
+
color: var(--neon-cyan);
|
|
383
|
+
background: rgba(0, 255, 238, 0.1);
|
|
384
|
+
border: 1px solid rgba(0, 255, 238, 0.25);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
.neon-badge-magenta {
|
|
388
|
+
color: var(--neon-magenta);
|
|
389
|
+
background: rgba(255, 0, 170, 0.1);
|
|
390
|
+
border: 1px solid rgba(255, 0, 170, 0.25);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
.neon-badge-green {
|
|
394
|
+
color: var(--neon-green);
|
|
395
|
+
background: rgba(57, 255, 20, 0.1);
|
|
396
|
+
border: 1px solid rgba(57, 255, 20, 0.25);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
.neon-badge-yellow {
|
|
400
|
+
color: var(--neon-yellow);
|
|
401
|
+
background: rgba(255, 230, 0, 0.1);
|
|
402
|
+
border: 1px solid rgba(255, 230, 0, 0.25);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/* Status dot inside badge */
|
|
406
|
+
.neon-badge-dot {
|
|
407
|
+
width: 6px;
|
|
408
|
+
height: 6px;
|
|
409
|
+
border-radius: 50%;
|
|
410
|
+
background: currentColor;
|
|
411
|
+
box-shadow: 0 0 6px currentColor;
|
|
412
|
+
}
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
### Sidebar Navigation
|
|
416
|
+
|
|
417
|
+
```css
|
|
418
|
+
.neon-sidebar {
|
|
419
|
+
background: var(--neon-surface-0);
|
|
420
|
+
border-right: 1px solid var(--neon-surface-3);
|
|
421
|
+
width: 260px;
|
|
422
|
+
padding: 16px 0;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
.neon-nav-item {
|
|
426
|
+
font-family: 'JetBrains Mono', monospace;
|
|
427
|
+
font-size: 13px;
|
|
428
|
+
font-weight: 500;
|
|
429
|
+
letter-spacing: 0.02em;
|
|
430
|
+
color: var(--neon-text-secondary);
|
|
431
|
+
padding: 10px 20px;
|
|
432
|
+
display: flex;
|
|
433
|
+
align-items: center;
|
|
434
|
+
gap: 12px;
|
|
435
|
+
border-radius: 0;
|
|
436
|
+
border-left: 2px solid transparent;
|
|
437
|
+
transition: all 0.15s ease;
|
|
438
|
+
cursor: pointer;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
.neon-nav-item:hover {
|
|
442
|
+
color: var(--neon-text-primary);
|
|
443
|
+
background: var(--neon-surface-2);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
.neon-nav-item.active {
|
|
447
|
+
color: var(--neon-cyan);
|
|
448
|
+
border-left-color: var(--neon-cyan);
|
|
449
|
+
background: rgba(0, 255, 238, 0.05);
|
|
450
|
+
text-shadow: 0 0 10px rgba(0, 255, 238, 0.3);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
.neon-nav-section-label {
|
|
454
|
+
font-family: 'JetBrains Mono', monospace;
|
|
455
|
+
font-size: 10px;
|
|
456
|
+
font-weight: 700;
|
|
457
|
+
letter-spacing: 0.12em;
|
|
458
|
+
text-transform: uppercase;
|
|
459
|
+
color: var(--neon-text-muted);
|
|
460
|
+
padding: 20px 20px 8px;
|
|
461
|
+
}
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
### Tables / Data Grids
|
|
465
|
+
|
|
466
|
+
```css
|
|
467
|
+
.neon-table {
|
|
468
|
+
width: 100%;
|
|
469
|
+
border-collapse: collapse;
|
|
470
|
+
font-family: 'IBM Plex Sans', sans-serif;
|
|
471
|
+
font-size: 14px;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
.neon-table thead th {
|
|
475
|
+
font-family: 'JetBrains Mono', monospace;
|
|
476
|
+
font-size: 11px;
|
|
477
|
+
font-weight: 600;
|
|
478
|
+
letter-spacing: 0.08em;
|
|
479
|
+
text-transform: uppercase;
|
|
480
|
+
color: var(--neon-text-muted);
|
|
481
|
+
background: var(--neon-surface-1);
|
|
482
|
+
padding: 12px 16px;
|
|
483
|
+
text-align: left;
|
|
484
|
+
border-bottom: 1px solid var(--neon-surface-3);
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
.neon-table tbody tr {
|
|
488
|
+
border-bottom: 1px solid var(--neon-surface-3);
|
|
489
|
+
transition: background 0.1s ease;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
.neon-table tbody tr:hover {
|
|
493
|
+
background: var(--neon-surface-2);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
.neon-table tbody td {
|
|
497
|
+
padding: 14px 16px;
|
|
498
|
+
color: var(--neon-text-primary);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/* Monospace columns (IDs, codes, timestamps) */
|
|
502
|
+
.neon-table .col-mono {
|
|
503
|
+
font-family: 'JetBrains Mono', monospace;
|
|
504
|
+
font-size: 13px;
|
|
505
|
+
color: var(--neon-text-secondary);
|
|
506
|
+
}
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
### Toasts / Notifications
|
|
510
|
+
|
|
511
|
+
```css
|
|
512
|
+
.neon-toast {
|
|
513
|
+
font-family: 'IBM Plex Sans', sans-serif;
|
|
514
|
+
font-size: 14px;
|
|
515
|
+
background: var(--neon-surface-1);
|
|
516
|
+
border-radius: 0px;
|
|
517
|
+
border-left: 3px solid;
|
|
518
|
+
padding: 16px 20px;
|
|
519
|
+
box-shadow:
|
|
520
|
+
0 4px 24px rgba(0, 0, 0, 0.5),
|
|
521
|
+
0 0 1px rgba(0, 255, 238, 0.2);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
.neon-toast-success {
|
|
525
|
+
border-left-color: var(--neon-green);
|
|
526
|
+
box-shadow:
|
|
527
|
+
0 4px 24px rgba(0, 0, 0, 0.5),
|
|
528
|
+
0 0 15px rgba(57, 255, 20, 0.1);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
.neon-toast-error {
|
|
532
|
+
border-left-color: var(--neon-magenta);
|
|
533
|
+
box-shadow:
|
|
534
|
+
0 4px 24px rgba(0, 0, 0, 0.5),
|
|
535
|
+
0 0 15px rgba(255, 0, 170, 0.1);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
.neon-toast-warning {
|
|
539
|
+
border-left-color: var(--neon-yellow);
|
|
540
|
+
}
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
### Modals / Dialogs
|
|
544
|
+
|
|
545
|
+
```css
|
|
546
|
+
.neon-modal-overlay {
|
|
547
|
+
background: rgba(7, 8, 10, 0.85);
|
|
548
|
+
backdrop-filter: blur(8px);
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
.neon-modal {
|
|
552
|
+
background: var(--neon-surface-0);
|
|
553
|
+
border: 1px solid var(--neon-surface-3);
|
|
554
|
+
border-radius: 0px;
|
|
555
|
+
box-shadow:
|
|
556
|
+
0 24px 80px rgba(0, 0, 0, 0.6),
|
|
557
|
+
0 0 1px rgba(0, 255, 238, 0.3);
|
|
558
|
+
max-width: 520px;
|
|
559
|
+
width: 100%;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
.neon-modal-header {
|
|
563
|
+
padding: 20px 24px;
|
|
564
|
+
border-bottom: 1px solid var(--neon-surface-3);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
.neon-modal-title {
|
|
568
|
+
font-family: 'JetBrains Mono', monospace;
|
|
569
|
+
font-size: 18px;
|
|
570
|
+
font-weight: 700;
|
|
571
|
+
color: var(--neon-text-primary);
|
|
572
|
+
}
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
### Scrollbar Styling
|
|
576
|
+
|
|
577
|
+
```css
|
|
578
|
+
.neon-scrollbar::-webkit-scrollbar {
|
|
579
|
+
width: 6px;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
.neon-scrollbar::-webkit-scrollbar-track {
|
|
583
|
+
background: var(--neon-void);
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
.neon-scrollbar::-webkit-scrollbar-thumb {
|
|
587
|
+
background: var(--neon-surface-3);
|
|
588
|
+
border-radius: 0px;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
.neon-scrollbar::-webkit-scrollbar-thumb:hover {
|
|
592
|
+
background: var(--neon-cyan-muted);
|
|
593
|
+
}
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
---
|
|
597
|
+
|
|
598
|
+
## 5. Special Effects
|
|
599
|
+
|
|
600
|
+
### Scanline Overlay (Subtle)
|
|
601
|
+
|
|
602
|
+
A barely-visible CRT scanline effect on the page background for maximum terminal nostalgia. Use sparingly.
|
|
603
|
+
|
|
604
|
+
```css
|
|
605
|
+
.neon-scanlines::after {
|
|
606
|
+
content: '';
|
|
607
|
+
position: fixed;
|
|
608
|
+
top: 0;
|
|
609
|
+
left: 0;
|
|
610
|
+
width: 100%;
|
|
611
|
+
height: 100%;
|
|
612
|
+
background: repeating-linear-gradient(
|
|
613
|
+
0deg,
|
|
614
|
+
transparent,
|
|
615
|
+
transparent 2px,
|
|
616
|
+
rgba(0, 0, 0, 0.03) 2px,
|
|
617
|
+
rgba(0, 0, 0, 0.03) 4px
|
|
618
|
+
);
|
|
619
|
+
pointer-events: none;
|
|
620
|
+
z-index: 9999;
|
|
621
|
+
}
|
|
622
|
+
```
|
|
623
|
+
|
|
624
|
+
### Neon Pulse Animation (For key CTAs)
|
|
625
|
+
|
|
626
|
+
```css
|
|
627
|
+
@keyframes neon-pulse {
|
|
628
|
+
0%, 100% {
|
|
629
|
+
box-shadow:
|
|
630
|
+
0 0 5px rgba(0, 255, 238, 0.4),
|
|
631
|
+
0 0 20px rgba(0, 255, 238, 0.15);
|
|
632
|
+
}
|
|
633
|
+
50% {
|
|
634
|
+
box-shadow:
|
|
635
|
+
0 0 10px rgba(0, 255, 238, 0.6),
|
|
636
|
+
0 0 40px rgba(0, 255, 238, 0.25),
|
|
637
|
+
0 0 80px rgba(0, 255, 238, 0.1);
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
.neon-pulse {
|
|
642
|
+
animation: neon-pulse 2s ease-in-out infinite;
|
|
643
|
+
}
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
### Typing Cursor Blink (For section titles)
|
|
647
|
+
|
|
648
|
+
```css
|
|
649
|
+
@keyframes blink {
|
|
650
|
+
0%, 100% { opacity: 1; }
|
|
651
|
+
50% { opacity: 0; }
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
.neon-cursor::after {
|
|
655
|
+
content: '_';
|
|
656
|
+
color: var(--neon-cyan);
|
|
657
|
+
animation: blink 1s step-end infinite;
|
|
658
|
+
margin-left: 2px;
|
|
659
|
+
}
|
|
660
|
+
```
|
|
661
|
+
|
|
662
|
+
### Grid Background Pattern
|
|
663
|
+
|
|
664
|
+
A subtle dot-grid pattern behind the main content area, like graph paper in a sci-fi interface:
|
|
665
|
+
|
|
666
|
+
```css
|
|
667
|
+
.neon-grid-bg {
|
|
668
|
+
background-image: radial-gradient(
|
|
669
|
+
circle,
|
|
670
|
+
rgba(0, 255, 238, 0.06) 1px,
|
|
671
|
+
transparent 1px
|
|
672
|
+
);
|
|
673
|
+
background-size: 24px 24px;
|
|
674
|
+
}
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
---
|
|
678
|
+
|
|
679
|
+
## 6. Tailwind v4 Theme Configuration
|
|
680
|
+
|
|
681
|
+
```css
|
|
682
|
+
@import "tailwindcss";
|
|
683
|
+
|
|
684
|
+
@theme {
|
|
685
|
+
/* Neon Terminal Colors */
|
|
686
|
+
--color-void: #07080A;
|
|
687
|
+
--color-surface-0: #0D0F14;
|
|
688
|
+
--color-surface-1: #13161D;
|
|
689
|
+
--color-surface-2: #1A1E27;
|
|
690
|
+
--color-surface-3: #242832;
|
|
691
|
+
|
|
692
|
+
--color-neon-cyan: #00FFEE;
|
|
693
|
+
--color-neon-cyan-muted: #0ABDC6;
|
|
694
|
+
--color-neon-magenta: #FF00AA;
|
|
695
|
+
--color-neon-green: #39FF14;
|
|
696
|
+
--color-neon-yellow: #FFE600;
|
|
697
|
+
--color-neon-purple: #BD00FF;
|
|
698
|
+
|
|
699
|
+
--color-neon-text-primary: #E8ECF1;
|
|
700
|
+
--color-neon-text-secondary: #8B95A5;
|
|
701
|
+
--color-neon-text-muted: #4A5568;
|
|
702
|
+
|
|
703
|
+
/* Font families */
|
|
704
|
+
--font-heading: 'JetBrains Mono', monospace;
|
|
705
|
+
--font-body: 'IBM Plex Sans', sans-serif;
|
|
706
|
+
--font-mono: 'JetBrains Mono', monospace;
|
|
707
|
+
|
|
708
|
+
/* Border radius tokens */
|
|
709
|
+
--radius-sharp: 0px;
|
|
710
|
+
--radius-terminal: 2px;
|
|
711
|
+
--radius-pill: 9999px;
|
|
712
|
+
}
|
|
713
|
+
```
|
|
714
|
+
|
|
715
|
+
### Tailwind Utility Examples
|
|
716
|
+
|
|
717
|
+
```html
|
|
718
|
+
<!-- Page title with glow -->
|
|
719
|
+
<h1 class="font-heading text-[40px] font-extrabold uppercase tracking-tight text-neon-cyan
|
|
720
|
+
[text-shadow:0_0_7px_rgba(0,255,238,0.6),0_0_20px_rgba(0,255,238,0.3)]">
|
|
721
|
+
DASHBOARD_
|
|
722
|
+
</h1>
|
|
723
|
+
|
|
724
|
+
<!-- Primary button -->
|
|
725
|
+
<button class="font-mono text-[13px] font-semibold uppercase tracking-wider
|
|
726
|
+
bg-neon-cyan text-void rounded-pill px-7 py-2.5
|
|
727
|
+
shadow-[0_0_5px_rgba(0,255,238,0.4),0_0_20px_rgba(0,255,238,0.15)]
|
|
728
|
+
hover:shadow-[0_0_8px_rgba(0,255,238,0.6),0_0_30px_rgba(0,255,238,0.3)]
|
|
729
|
+
transition-all duration-200">
|
|
730
|
+
EXECUTE
|
|
731
|
+
</button>
|
|
732
|
+
|
|
733
|
+
<!-- Sharp card -->
|
|
734
|
+
<div class="bg-surface-0 border border-surface-3 rounded-sharp p-6">
|
|
735
|
+
<h3 class="font-heading text-xl font-semibold text-neon-text-primary">Card Title</h3>
|
|
736
|
+
<p class="font-body text-[15px] text-neon-text-secondary mt-2">Card content here.</p>
|
|
737
|
+
</div>
|
|
738
|
+
|
|
739
|
+
<!-- Terminal input -->
|
|
740
|
+
<input class="font-mono text-sm bg-void border border-surface-3 rounded-terminal
|
|
741
|
+
text-neon-text-primary px-4 py-3
|
|
742
|
+
focus:border-neon-cyan focus:shadow-[0_0_0_1px_#00FFEE,0_0_15px_rgba(0,255,238,0.15)]
|
|
743
|
+
focus:outline-none caret-neon-cyan
|
|
744
|
+
placeholder:text-neon-text-muted placeholder:italic"
|
|
745
|
+
placeholder="type command..." />
|
|
746
|
+
|
|
747
|
+
<!-- Neon badge -->
|
|
748
|
+
<span class="font-mono text-[11px] font-medium uppercase tracking-wider
|
|
749
|
+
text-neon-cyan bg-neon-cyan/10 border border-neon-cyan/25
|
|
750
|
+
rounded-pill px-3 py-1">
|
|
751
|
+
ACTIVE
|
|
752
|
+
</span>
|
|
753
|
+
```
|
|
754
|
+
|
|
755
|
+
---
|
|
756
|
+
|
|
757
|
+
## 7. Inspiration References
|
|
758
|
+
|
|
759
|
+
| Source | What to Borrow |
|
|
760
|
+
|----------------------|-------------------------------------------------------------------------|
|
|
761
|
+
| **Warp Terminal** | Block-based UI, monospace-first, dark void backgrounds, input styling |
|
|
762
|
+
| **Linear (dark)** | Elevation through surface layering, minimal color use, tight spacing |
|
|
763
|
+
| **Cyberpunk 2077 UI**| Angled corner cuts, neon cyan/magenta palette, aggressive typography |
|
|
764
|
+
| **Vercel / Geist** | Background scale system (10 levels), type precision, minimal borders |
|
|
765
|
+
| **VS Code (dark)** | Sidebar patterns, monospace navigation, focus ring glow effects |
|
|
766
|
+
| **Raycast** | Speed-focused UI, keyboard-first feel, compact density |
|
|
767
|
+
| **GitHub Dark Mode** | Subtle surface elevation, muted secondary text, clean data tables |
|
|
768
|
+
|
|
769
|
+
---
|
|
770
|
+
|
|
771
|
+
## 8. Key Design Principles
|
|
772
|
+
|
|
773
|
+
1. **Terminal-first typography:** All headings, labels, navigation, badges, and interactive elements use JetBrains Mono. Only body/paragraph text uses the sans-serif.
|
|
774
|
+
2. **Glow as hierarchy:** The intensity of neon glow indicates importance. Primary actions glow bright; secondary elements have muted or no glow.
|
|
775
|
+
3. **Sharp vs. pill tension:** Containers are razor-sharp (0 radius). Interactive elements are fully rounded (pill). This contrast creates visual energy.
|
|
776
|
+
4. **Dark is not gray:** The base background is near-black (#07080A), not dark gray. Surfaces build up in extremely subtle steps. The palette should feel like staring into a void with neon floating on top.
|
|
777
|
+
5. **Uppercase everything interactive:** Buttons, badges, labels, nav section headers -- all uppercase monospace. This creates the "command line" energy.
|
|
778
|
+
6. **Restraint on glow:** Despite being a neon theme, glow effects are concentrated on focus states and primary CTAs. If everything glows, nothing glows.
|
|
779
|
+
7. **Color is signal:** Neon colors are used semantically (cyan = primary, green = success, magenta = danger, yellow = warning, purple = info). They are never decorative.
|