@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,1134 @@
|
|
|
1
|
+
# Neon Terminal: Violet Theme Spec
|
|
2
|
+
|
|
3
|
+
**Theme ID:** `neon-violet`
|
|
4
|
+
**Direction:** Dual-mode variant of Neon Terminal. Dark mode: deep purple void with electric violet neon accents. Light mode: lavender-tinted surfaces with sophisticated violet accents. Both modes retain the terminal DNA -- monospace type, sharp containers, pill buttons, command-line energy.
|
|
5
|
+
**Vibe:** If Linear went purple and kept the hacker energy. An elegant command center that works day and night. Synthwave dashboard by day, cyberpunk by night.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Color Palette
|
|
10
|
+
|
|
11
|
+
### Dark Mode
|
|
12
|
+
|
|
13
|
+
A deep purple-tinted void background with electric violet neon accents. Inspired by Synthwave '84, Shades of Purple terminal themes, and the original Neon Terminal pushed into the ultraviolet.
|
|
14
|
+
|
|
15
|
+
#### Base / Background Scale (Dark)
|
|
16
|
+
|
|
17
|
+
| Token | Hex | Usage |
|
|
18
|
+
|-------------------|-----------|---------------------------------------------|
|
|
19
|
+
| `void` | `#08060E` | Page background, deepest layer |
|
|
20
|
+
| `surface-0` | `#0F0B19` | Card backgrounds, sidebar |
|
|
21
|
+
| `surface-1` | `#161122` | Elevated cards, dropdowns, modals |
|
|
22
|
+
| `surface-2` | `#1E172E` | Hover states, active sidebar items |
|
|
23
|
+
| `surface-3` | `#2A2140` | Borders, dividers, subtle separators |
|
|
24
|
+
|
|
25
|
+
#### Neon Accent Scale (Dark)
|
|
26
|
+
|
|
27
|
+
| Token | Hex | Tailwind | Usage |
|
|
28
|
+
|----------------------|-----------|------------------|--------------------------------------|
|
|
29
|
+
| `neon-violet` | `#A855F7` | `purple-400` | Primary actions, links, focus rings |
|
|
30
|
+
| `neon-violet-bright` | `#C084FC` | `purple-300` | Highlighted text, active nav items |
|
|
31
|
+
| `neon-violet-muted` | `#7C3AED` | `violet-600` | Secondary text accents, badges |
|
|
32
|
+
| `neon-blue` | `#60A5FA` | `blue-400` | Info states, secondary accents |
|
|
33
|
+
| `neon-magenta` | `#F472B6` | `pink-400` | Destructive/danger, critical alerts |
|
|
34
|
+
| `neon-green` | `#34D399` | `emerald-400` | Success states, online indicators |
|
|
35
|
+
| `neon-yellow` | `#FBBF24` | `amber-400` | Warnings, pending states |
|
|
36
|
+
|
|
37
|
+
#### Text Scale (Dark)
|
|
38
|
+
|
|
39
|
+
| Token | Hex | Usage |
|
|
40
|
+
|-------------------|-----------|---------------------------------------------|
|
|
41
|
+
| `text-primary` | `#EDE9FE` | Primary text (lavender-white) |
|
|
42
|
+
| `text-secondary` | `#9F8BBF` | Secondary text, labels, placeholders |
|
|
43
|
+
| `text-muted` | `#5B4A73` | Disabled text, timestamps |
|
|
44
|
+
| `text-neon` | `#C084FC` | Highlighted text, active nav items |
|
|
45
|
+
|
|
46
|
+
#### Semantic Colors (Dark)
|
|
47
|
+
|
|
48
|
+
| Token | Hex | Usage |
|
|
49
|
+
|-------------------|-----------|---------------------------------------------|
|
|
50
|
+
| `success` | `#34D399` | Success toasts, completed states |
|
|
51
|
+
| `warning` | `#FBBF24` | Warning toasts, caution states |
|
|
52
|
+
| `error` | `#F472B6` | Error toasts, validation failures |
|
|
53
|
+
| `info` | `#60A5FA` | Informational toasts, tips |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### Light Mode
|
|
58
|
+
|
|
59
|
+
Cool lavender-tinted surfaces with violet accents on a clean, airy background. Not inverted dark -- a proper light theme with purple personality. Think "if Linear went purple" -- sophisticated, tech-forward, never garish.
|
|
60
|
+
|
|
61
|
+
#### Base / Background Scale (Light)
|
|
62
|
+
|
|
63
|
+
| Token | Hex | Usage |
|
|
64
|
+
|-------------------|-----------|---------------------------------------------|
|
|
65
|
+
| `void` | `#F8F5FF` | Page background, deepest layer |
|
|
66
|
+
| `surface-0` | `#FFFFFF` | Card backgrounds, sidebar |
|
|
67
|
+
| `surface-1` | `#F3EEFF` | Elevated cards, dropdowns, modals |
|
|
68
|
+
| `surface-2` | `#EDE5FC` | Hover states, active sidebar items |
|
|
69
|
+
| `surface-3` | `#DDD1F5` | Borders, dividers, subtle separators |
|
|
70
|
+
|
|
71
|
+
#### Accent Scale (Light)
|
|
72
|
+
|
|
73
|
+
| Token | Hex | Tailwind | Usage |
|
|
74
|
+
|----------------------|-----------|------------------|--------------------------------------|
|
|
75
|
+
| `accent-violet` | `#7C3AED` | `violet-600` | Primary actions, links, focus rings |
|
|
76
|
+
| `accent-violet-bold` | `#6D28D9` | `violet-700` | Hover states on primary elements |
|
|
77
|
+
| `accent-violet-soft` | `#8B5CF6` | `violet-500` | Secondary accents, badges background |
|
|
78
|
+
| `accent-blue` | `#3B82F6` | `blue-500` | Info states, secondary accents |
|
|
79
|
+
| `accent-rose` | `#E11D48` | `rose-600` | Destructive/danger, critical alerts |
|
|
80
|
+
| `accent-emerald` | `#059669` | `emerald-600` | Success states, online indicators |
|
|
81
|
+
| `accent-amber` | `#D97706` | `amber-600` | Warnings, pending states |
|
|
82
|
+
|
|
83
|
+
#### Text Scale (Light)
|
|
84
|
+
|
|
85
|
+
| Token | Hex | Usage |
|
|
86
|
+
|-------------------|-----------|---------------------------------------------|
|
|
87
|
+
| `text-primary` | `#1E103A` | Primary text (deep purple-black) |
|
|
88
|
+
| `text-secondary` | `#5B4A73` | Secondary text, labels, placeholders |
|
|
89
|
+
| `text-muted` | `#9F8BBF` | Disabled text, timestamps |
|
|
90
|
+
| `text-accent` | `#7C3AED` | Highlighted text, active nav items |
|
|
91
|
+
|
|
92
|
+
#### Semantic Colors (Light)
|
|
93
|
+
|
|
94
|
+
| Token | Hex | Usage |
|
|
95
|
+
|-------------------|-----------|---------------------------------------------|
|
|
96
|
+
| `success` | `#059669` | Success toasts, completed states |
|
|
97
|
+
| `warning` | `#D97706` | Warning toasts, caution states |
|
|
98
|
+
| `error` | `#E11D48` | Error toasts, validation failures |
|
|
99
|
+
| `info` | `#3B82F6` | Informational toasts, tips |
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
### CSS Custom Properties
|
|
104
|
+
|
|
105
|
+
```css
|
|
106
|
+
/* Dark Mode (default) */
|
|
107
|
+
:root {
|
|
108
|
+
--violet-void: #08060E;
|
|
109
|
+
--violet-surface-0: #0F0B19;
|
|
110
|
+
--violet-surface-1: #161122;
|
|
111
|
+
--violet-surface-2: #1E172E;
|
|
112
|
+
--violet-surface-3: #2A2140;
|
|
113
|
+
|
|
114
|
+
--violet-neon: #A855F7;
|
|
115
|
+
--violet-neon-bright: #C084FC;
|
|
116
|
+
--violet-neon-muted: #7C3AED;
|
|
117
|
+
--violet-blue: #60A5FA;
|
|
118
|
+
--violet-magenta: #F472B6;
|
|
119
|
+
--violet-green: #34D399;
|
|
120
|
+
--violet-yellow: #FBBF24;
|
|
121
|
+
|
|
122
|
+
--violet-text-primary: #EDE9FE;
|
|
123
|
+
--violet-text-secondary: #9F8BBF;
|
|
124
|
+
--violet-text-muted: #5B4A73;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/* Light Mode */
|
|
128
|
+
:root.light, [data-theme="light"] {
|
|
129
|
+
--violet-void: #F8F5FF;
|
|
130
|
+
--violet-surface-0: #FFFFFF;
|
|
131
|
+
--violet-surface-1: #F3EEFF;
|
|
132
|
+
--violet-surface-2: #EDE5FC;
|
|
133
|
+
--violet-surface-3: #DDD1F5;
|
|
134
|
+
|
|
135
|
+
--violet-neon: #7C3AED;
|
|
136
|
+
--violet-neon-bright: #6D28D9;
|
|
137
|
+
--violet-neon-muted: #8B5CF6;
|
|
138
|
+
--violet-blue: #3B82F6;
|
|
139
|
+
--violet-magenta: #E11D48;
|
|
140
|
+
--violet-green: #059669;
|
|
141
|
+
--violet-yellow: #D97706;
|
|
142
|
+
|
|
143
|
+
--violet-text-primary: #1E103A;
|
|
144
|
+
--violet-text-secondary: #5B4A73;
|
|
145
|
+
--violet-text-muted: #9F8BBF;
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 2. Typography
|
|
152
|
+
|
|
153
|
+
### Font Pairing
|
|
154
|
+
|
|
155
|
+
**Headings:** JetBrains Mono (monospace, bold weight)
|
|
156
|
+
**Body:** IBM Plex Sans (clean, technical sans-serif)
|
|
157
|
+
**Code / Badges / Labels:** JetBrains Mono (monospace, regular weight)
|
|
158
|
+
|
|
159
|
+
Same pairing as the original Neon Terminal. The terminal DNA runs through all variants. Both fonts share a technical lineage and complement each other perfectly.
|
|
160
|
+
|
|
161
|
+
### Google Fonts URL
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
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
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Type Scale
|
|
168
|
+
|
|
169
|
+
| Element | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|
|
170
|
+
|--------------------|------------------|----------|--------|-------------|----------------|---------------------------------------------|
|
|
171
|
+
| Page Title (h1) | JetBrains Mono | `40px` | 800 | 1.1 | `-0.03em` | UPPERCASE, violet glow (dark) / bold violet (light) |
|
|
172
|
+
| Section Title (h2) | JetBrains Mono | `28px` | 700 | 1.2 | `-0.02em` | Title case |
|
|
173
|
+
| Card Title (h3) | JetBrains Mono | `20px` | 600 | 1.3 | `-0.01em` | |
|
|
174
|
+
| Body | IBM Plex Sans | `15px` | 400 | 1.6 | `0` | |
|
|
175
|
+
| Body Small | IBM Plex Sans | `13px` | 400 | 1.5 | `0.01em` | |
|
|
176
|
+
| Label | JetBrains Mono | `11px` | 600 | 1.4 | `0.08em` | UPPERCASE, muted violet color |
|
|
177
|
+
| Badge | JetBrains Mono | `11px` | 500 | 1 | `0.05em` | UPPERCASE |
|
|
178
|
+
| Code | JetBrains Mono | `13px` | 400 | 1.5 | `0` | Inline code snippets |
|
|
179
|
+
| Nav Item | JetBrains Mono | `13px` | 500 | 1.4 | `0.02em` | Sidebar navigation |
|
|
180
|
+
|
|
181
|
+
### CSS
|
|
182
|
+
|
|
183
|
+
```css
|
|
184
|
+
/* DARK MODE */
|
|
185
|
+
.violet-h1 {
|
|
186
|
+
font-family: 'JetBrains Mono', monospace;
|
|
187
|
+
font-size: 40px;
|
|
188
|
+
font-weight: 800;
|
|
189
|
+
line-height: 1.1;
|
|
190
|
+
letter-spacing: -0.03em;
|
|
191
|
+
text-transform: uppercase;
|
|
192
|
+
color: var(--violet-neon);
|
|
193
|
+
text-shadow:
|
|
194
|
+
0 0 7px rgba(168, 85, 247, 0.6),
|
|
195
|
+
0 0 20px rgba(168, 85, 247, 0.3),
|
|
196
|
+
0 0 42px rgba(168, 85, 247, 0.15);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/* LIGHT MODE */
|
|
200
|
+
.light .violet-h1 {
|
|
201
|
+
color: var(--violet-neon);
|
|
202
|
+
text-shadow: none;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.violet-h2 {
|
|
206
|
+
font-family: 'JetBrains Mono', monospace;
|
|
207
|
+
font-size: 28px;
|
|
208
|
+
font-weight: 700;
|
|
209
|
+
line-height: 1.2;
|
|
210
|
+
letter-spacing: -0.02em;
|
|
211
|
+
color: var(--violet-text-primary);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.violet-body {
|
|
215
|
+
font-family: 'IBM Plex Sans', sans-serif;
|
|
216
|
+
font-size: 15px;
|
|
217
|
+
font-weight: 400;
|
|
218
|
+
line-height: 1.6;
|
|
219
|
+
color: var(--violet-text-primary);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.violet-label {
|
|
223
|
+
font-family: 'JetBrains Mono', monospace;
|
|
224
|
+
font-size: 11px;
|
|
225
|
+
font-weight: 600;
|
|
226
|
+
line-height: 1.4;
|
|
227
|
+
letter-spacing: 0.08em;
|
|
228
|
+
text-transform: uppercase;
|
|
229
|
+
color: var(--violet-neon-muted);
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## 3. Shape Language
|
|
236
|
+
|
|
237
|
+
Identical to Neon Terminal. The shape tension is a family trait: **razor-sharp containers** vs. **pill-shaped interactive elements**.
|
|
238
|
+
|
|
239
|
+
### Border Radius Tokens
|
|
240
|
+
|
|
241
|
+
| Token | Value | Usage |
|
|
242
|
+
|--------------------|----------|---------------------------------------------|
|
|
243
|
+
| `radius-none` | `0px` | Cards, panels, modal containers, tables |
|
|
244
|
+
| `radius-sm` | `2px` | Input fields, code blocks |
|
|
245
|
+
| `radius-pill` | `9999px` | Buttons, badges, pills, tags, toggles |
|
|
246
|
+
| `radius-circle` | `50%` | Avatars, status indicators |
|
|
247
|
+
|
|
248
|
+
### Design Rules
|
|
249
|
+
|
|
250
|
+
1. **Cards / Panels / Modals:** `border-radius: 0px` -- Hard, sharp corners. Industrial.
|
|
251
|
+
2. **Buttons:** `border-radius: 9999px` -- Full pill shape. Futuristic contrast.
|
|
252
|
+
3. **Input fields:** `border-radius: 2px` -- Almost sharp, terminal-like.
|
|
253
|
+
4. **Badges / Tags:** `border-radius: 9999px` -- Pill-shaped.
|
|
254
|
+
5. **Avatars:** `border-radius: 50%` -- Classic circle.
|
|
255
|
+
6. **Dropdown menus:** `border-radius: 0px` -- Sharp to match cards.
|
|
256
|
+
7. **Sidebar:** Sharp corners everywhere.
|
|
257
|
+
|
|
258
|
+
### Corner Cut Effect (Optional Enhancement)
|
|
259
|
+
|
|
260
|
+
Same chamfered/beveled corners as Neon Terminal, but with violet accent:
|
|
261
|
+
|
|
262
|
+
```css
|
|
263
|
+
.violet-card-cut {
|
|
264
|
+
clip-path: polygon(
|
|
265
|
+
0 0,
|
|
266
|
+
calc(100% - 16px) 0,
|
|
267
|
+
100% 16px,
|
|
268
|
+
100% 100%,
|
|
269
|
+
16px 100%,
|
|
270
|
+
0 calc(100% - 16px)
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## 4. Component Styling
|
|
278
|
+
|
|
279
|
+
### Buttons
|
|
280
|
+
|
|
281
|
+
```css
|
|
282
|
+
/* === DARK MODE === */
|
|
283
|
+
|
|
284
|
+
/* Primary Button */
|
|
285
|
+
.violet-btn-primary {
|
|
286
|
+
font-family: 'JetBrains Mono', monospace;
|
|
287
|
+
font-size: 13px;
|
|
288
|
+
font-weight: 600;
|
|
289
|
+
letter-spacing: 0.05em;
|
|
290
|
+
text-transform: uppercase;
|
|
291
|
+
color: #FFFFFF;
|
|
292
|
+
background: var(--violet-neon);
|
|
293
|
+
border: none;
|
|
294
|
+
border-radius: 9999px;
|
|
295
|
+
padding: 10px 28px;
|
|
296
|
+
cursor: pointer;
|
|
297
|
+
transition: all 0.2s ease;
|
|
298
|
+
box-shadow:
|
|
299
|
+
0 0 5px rgba(168, 85, 247, 0.4),
|
|
300
|
+
0 0 20px rgba(168, 85, 247, 0.15);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
.violet-btn-primary:hover {
|
|
304
|
+
box-shadow:
|
|
305
|
+
0 0 8px rgba(168, 85, 247, 0.6),
|
|
306
|
+
0 0 30px rgba(168, 85, 247, 0.3),
|
|
307
|
+
0 0 60px rgba(168, 85, 247, 0.1);
|
|
308
|
+
transform: translateY(-1px);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.violet-btn-primary:active {
|
|
312
|
+
transform: translateY(0);
|
|
313
|
+
box-shadow: 0 0 5px rgba(168, 85, 247, 0.4);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/* Ghost / Outline Button */
|
|
317
|
+
.violet-btn-ghost {
|
|
318
|
+
font-family: 'JetBrains Mono', monospace;
|
|
319
|
+
font-size: 13px;
|
|
320
|
+
font-weight: 500;
|
|
321
|
+
letter-spacing: 0.05em;
|
|
322
|
+
text-transform: uppercase;
|
|
323
|
+
color: var(--violet-neon);
|
|
324
|
+
background: transparent;
|
|
325
|
+
border: 1px solid var(--violet-surface-3);
|
|
326
|
+
border-radius: 9999px;
|
|
327
|
+
padding: 10px 28px;
|
|
328
|
+
cursor: pointer;
|
|
329
|
+
transition: all 0.2s ease;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
.violet-btn-ghost:hover {
|
|
333
|
+
border-color: var(--violet-neon);
|
|
334
|
+
box-shadow: 0 0 10px rgba(168, 85, 247, 0.2);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/* Danger Button */
|
|
338
|
+
.violet-btn-danger {
|
|
339
|
+
color: #FFFFFF;
|
|
340
|
+
background: var(--violet-magenta);
|
|
341
|
+
border-radius: 9999px;
|
|
342
|
+
box-shadow:
|
|
343
|
+
0 0 5px rgba(244, 114, 182, 0.4),
|
|
344
|
+
0 0 20px rgba(244, 114, 182, 0.15);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/* === LIGHT MODE === */
|
|
348
|
+
|
|
349
|
+
.light .violet-btn-primary {
|
|
350
|
+
color: #FFFFFF;
|
|
351
|
+
background: var(--violet-neon);
|
|
352
|
+
box-shadow: 0 1px 3px rgba(124, 58, 237, 0.3);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
.light .violet-btn-primary:hover {
|
|
356
|
+
background: var(--violet-neon-bright);
|
|
357
|
+
box-shadow: 0 2px 8px rgba(124, 58, 237, 0.35);
|
|
358
|
+
transform: translateY(-1px);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
.light .violet-btn-ghost {
|
|
362
|
+
color: var(--violet-neon);
|
|
363
|
+
border-color: var(--violet-surface-3);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
.light .violet-btn-ghost:hover {
|
|
367
|
+
border-color: var(--violet-neon);
|
|
368
|
+
background: rgba(124, 58, 237, 0.05);
|
|
369
|
+
box-shadow: none;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
.light .violet-btn-danger {
|
|
373
|
+
color: #FFFFFF;
|
|
374
|
+
background: var(--violet-magenta);
|
|
375
|
+
box-shadow: 0 1px 3px rgba(225, 29, 72, 0.3);
|
|
376
|
+
}
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
### Input Fields (Terminal Style)
|
|
380
|
+
|
|
381
|
+
```css
|
|
382
|
+
/* === DARK MODE === */
|
|
383
|
+
.violet-input {
|
|
384
|
+
font-family: 'JetBrains Mono', monospace;
|
|
385
|
+
font-size: 14px;
|
|
386
|
+
color: var(--violet-text-primary);
|
|
387
|
+
background: var(--violet-void);
|
|
388
|
+
border: 1px solid var(--violet-surface-3);
|
|
389
|
+
border-radius: 2px;
|
|
390
|
+
padding: 12px 16px;
|
|
391
|
+
transition: all 0.2s ease;
|
|
392
|
+
caret-color: var(--violet-neon);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.violet-input::placeholder {
|
|
396
|
+
color: var(--violet-text-muted);
|
|
397
|
+
font-style: italic;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
.violet-input:focus {
|
|
401
|
+
outline: none;
|
|
402
|
+
border-color: var(--violet-neon);
|
|
403
|
+
box-shadow:
|
|
404
|
+
0 0 0 1px var(--violet-neon),
|
|
405
|
+
0 0 15px rgba(168, 85, 247, 0.15);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/* === LIGHT MODE === */
|
|
409
|
+
.light .violet-input {
|
|
410
|
+
background: #FFFFFF;
|
|
411
|
+
border-color: var(--violet-surface-3);
|
|
412
|
+
color: var(--violet-text-primary);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
.light .violet-input:focus {
|
|
416
|
+
border-color: var(--violet-neon);
|
|
417
|
+
box-shadow:
|
|
418
|
+
0 0 0 2px rgba(124, 58, 237, 0.15),
|
|
419
|
+
0 1px 3px rgba(124, 58, 237, 0.08);
|
|
420
|
+
}
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### Cards
|
|
424
|
+
|
|
425
|
+
```css
|
|
426
|
+
/* === DARK MODE === */
|
|
427
|
+
.violet-card {
|
|
428
|
+
background: var(--violet-surface-0);
|
|
429
|
+
border: 1px solid var(--violet-surface-3);
|
|
430
|
+
border-radius: 0px;
|
|
431
|
+
padding: 24px;
|
|
432
|
+
position: relative;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
.violet-card-accent {
|
|
436
|
+
border-top: 2px solid var(--violet-neon);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
.violet-card:hover {
|
|
440
|
+
border-color: rgba(168, 85, 247, 0.3);
|
|
441
|
+
box-shadow: 0 0 20px rgba(168, 85, 247, 0.05);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/* Stat card */
|
|
445
|
+
.violet-stat-value {
|
|
446
|
+
font-family: 'JetBrains Mono', monospace;
|
|
447
|
+
font-size: 48px;
|
|
448
|
+
font-weight: 800;
|
|
449
|
+
color: var(--violet-neon);
|
|
450
|
+
text-shadow: 0 0 20px rgba(168, 85, 247, 0.3);
|
|
451
|
+
line-height: 1;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
.violet-stat-label {
|
|
455
|
+
font-family: 'JetBrains Mono', monospace;
|
|
456
|
+
font-size: 11px;
|
|
457
|
+
font-weight: 600;
|
|
458
|
+
letter-spacing: 0.08em;
|
|
459
|
+
text-transform: uppercase;
|
|
460
|
+
color: var(--violet-text-muted);
|
|
461
|
+
margin-top: 8px;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/* === LIGHT MODE === */
|
|
465
|
+
.light .violet-card {
|
|
466
|
+
background: var(--violet-surface-0);
|
|
467
|
+
border-color: var(--violet-surface-3);
|
|
468
|
+
box-shadow: 0 1px 3px rgba(124, 58, 237, 0.04);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
.light .violet-card-accent {
|
|
472
|
+
border-top-color: var(--violet-neon);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
.light .violet-card:hover {
|
|
476
|
+
border-color: rgba(124, 58, 237, 0.25);
|
|
477
|
+
box-shadow: 0 2px 12px rgba(124, 58, 237, 0.06);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
.light .violet-stat-value {
|
|
481
|
+
color: var(--violet-neon);
|
|
482
|
+
text-shadow: none;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
.light .violet-stat-label {
|
|
486
|
+
color: var(--violet-text-muted);
|
|
487
|
+
}
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### Badges / Tags
|
|
491
|
+
|
|
492
|
+
```css
|
|
493
|
+
.violet-badge {
|
|
494
|
+
font-family: 'JetBrains Mono', monospace;
|
|
495
|
+
font-size: 11px;
|
|
496
|
+
font-weight: 500;
|
|
497
|
+
letter-spacing: 0.05em;
|
|
498
|
+
text-transform: uppercase;
|
|
499
|
+
padding: 4px 12px;
|
|
500
|
+
border-radius: 9999px;
|
|
501
|
+
display: inline-flex;
|
|
502
|
+
align-items: center;
|
|
503
|
+
gap: 6px;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/* === DARK MODE BADGES === */
|
|
507
|
+
.violet-badge-purple {
|
|
508
|
+
color: var(--violet-neon-bright);
|
|
509
|
+
background: rgba(168, 85, 247, 0.1);
|
|
510
|
+
border: 1px solid rgba(168, 85, 247, 0.25);
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
.violet-badge-pink {
|
|
514
|
+
color: var(--violet-magenta);
|
|
515
|
+
background: rgba(244, 114, 182, 0.1);
|
|
516
|
+
border: 1px solid rgba(244, 114, 182, 0.25);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
.violet-badge-green {
|
|
520
|
+
color: var(--violet-green);
|
|
521
|
+
background: rgba(52, 211, 153, 0.1);
|
|
522
|
+
border: 1px solid rgba(52, 211, 153, 0.25);
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
.violet-badge-yellow {
|
|
526
|
+
color: var(--violet-yellow);
|
|
527
|
+
background: rgba(251, 191, 36, 0.1);
|
|
528
|
+
border: 1px solid rgba(251, 191, 36, 0.25);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
.violet-badge-blue {
|
|
532
|
+
color: var(--violet-blue);
|
|
533
|
+
background: rgba(96, 165, 250, 0.1);
|
|
534
|
+
border: 1px solid rgba(96, 165, 250, 0.25);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/* === LIGHT MODE BADGES === */
|
|
538
|
+
.light .violet-badge-purple {
|
|
539
|
+
color: var(--violet-neon);
|
|
540
|
+
background: rgba(124, 58, 237, 0.08);
|
|
541
|
+
border-color: rgba(124, 58, 237, 0.2);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
.light .violet-badge-pink {
|
|
545
|
+
color: var(--violet-magenta);
|
|
546
|
+
background: rgba(225, 29, 72, 0.06);
|
|
547
|
+
border-color: rgba(225, 29, 72, 0.2);
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
.light .violet-badge-green {
|
|
551
|
+
color: var(--violet-green);
|
|
552
|
+
background: rgba(5, 150, 105, 0.06);
|
|
553
|
+
border-color: rgba(5, 150, 105, 0.2);
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
.light .violet-badge-yellow {
|
|
557
|
+
color: var(--violet-yellow);
|
|
558
|
+
background: rgba(217, 119, 6, 0.06);
|
|
559
|
+
border-color: rgba(217, 119, 6, 0.2);
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
.light .violet-badge-blue {
|
|
563
|
+
color: var(--violet-blue);
|
|
564
|
+
background: rgba(59, 130, 246, 0.06);
|
|
565
|
+
border-color: rgba(59, 130, 246, 0.2);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
/* Status dot inside badge */
|
|
569
|
+
.violet-badge-dot {
|
|
570
|
+
width: 6px;
|
|
571
|
+
height: 6px;
|
|
572
|
+
border-radius: 50%;
|
|
573
|
+
background: currentColor;
|
|
574
|
+
box-shadow: 0 0 6px currentColor;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
/* Light mode: no glow on dot */
|
|
578
|
+
.light .violet-badge-dot {
|
|
579
|
+
box-shadow: none;
|
|
580
|
+
}
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
### Sidebar Navigation
|
|
584
|
+
|
|
585
|
+
```css
|
|
586
|
+
/* === DARK MODE === */
|
|
587
|
+
.violet-sidebar {
|
|
588
|
+
background: var(--violet-surface-0);
|
|
589
|
+
border-right: 1px solid var(--violet-surface-3);
|
|
590
|
+
width: 260px;
|
|
591
|
+
padding: 16px 0;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
.violet-nav-item {
|
|
595
|
+
font-family: 'JetBrains Mono', monospace;
|
|
596
|
+
font-size: 13px;
|
|
597
|
+
font-weight: 500;
|
|
598
|
+
letter-spacing: 0.02em;
|
|
599
|
+
color: var(--violet-text-secondary);
|
|
600
|
+
padding: 10px 20px;
|
|
601
|
+
display: flex;
|
|
602
|
+
align-items: center;
|
|
603
|
+
gap: 12px;
|
|
604
|
+
border-radius: 0;
|
|
605
|
+
border-left: 2px solid transparent;
|
|
606
|
+
transition: all 0.15s ease;
|
|
607
|
+
cursor: pointer;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
.violet-nav-item:hover {
|
|
611
|
+
color: var(--violet-text-primary);
|
|
612
|
+
background: var(--violet-surface-2);
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
.violet-nav-item.active {
|
|
616
|
+
color: var(--violet-neon);
|
|
617
|
+
border-left-color: var(--violet-neon);
|
|
618
|
+
background: rgba(168, 85, 247, 0.05);
|
|
619
|
+
text-shadow: 0 0 10px rgba(168, 85, 247, 0.3);
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
.violet-nav-section-label {
|
|
623
|
+
font-family: 'JetBrains Mono', monospace;
|
|
624
|
+
font-size: 10px;
|
|
625
|
+
font-weight: 700;
|
|
626
|
+
letter-spacing: 0.12em;
|
|
627
|
+
text-transform: uppercase;
|
|
628
|
+
color: var(--violet-text-muted);
|
|
629
|
+
padding: 20px 20px 8px;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
/* === LIGHT MODE === */
|
|
633
|
+
.light .violet-sidebar {
|
|
634
|
+
background: var(--violet-surface-0);
|
|
635
|
+
border-right-color: var(--violet-surface-3);
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
.light .violet-nav-item {
|
|
639
|
+
color: var(--violet-text-secondary);
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
.light .violet-nav-item:hover {
|
|
643
|
+
color: var(--violet-text-primary);
|
|
644
|
+
background: var(--violet-surface-2);
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
.light .violet-nav-item.active {
|
|
648
|
+
color: var(--violet-neon);
|
|
649
|
+
border-left-color: var(--violet-neon);
|
|
650
|
+
background: rgba(124, 58, 237, 0.05);
|
|
651
|
+
text-shadow: none;
|
|
652
|
+
}
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
### Tables / Data Grids
|
|
656
|
+
|
|
657
|
+
```css
|
|
658
|
+
.violet-table {
|
|
659
|
+
width: 100%;
|
|
660
|
+
border-collapse: collapse;
|
|
661
|
+
font-family: 'IBM Plex Sans', sans-serif;
|
|
662
|
+
font-size: 14px;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
/* === DARK MODE === */
|
|
666
|
+
.violet-table thead th {
|
|
667
|
+
font-family: 'JetBrains Mono', monospace;
|
|
668
|
+
font-size: 11px;
|
|
669
|
+
font-weight: 600;
|
|
670
|
+
letter-spacing: 0.08em;
|
|
671
|
+
text-transform: uppercase;
|
|
672
|
+
color: var(--violet-text-muted);
|
|
673
|
+
background: var(--violet-surface-1);
|
|
674
|
+
padding: 12px 16px;
|
|
675
|
+
text-align: left;
|
|
676
|
+
border-bottom: 1px solid var(--violet-surface-3);
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
.violet-table tbody tr {
|
|
680
|
+
border-bottom: 1px solid var(--violet-surface-3);
|
|
681
|
+
transition: background 0.1s ease;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
.violet-table tbody tr:hover {
|
|
685
|
+
background: var(--violet-surface-2);
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
.violet-table tbody td {
|
|
689
|
+
padding: 14px 16px;
|
|
690
|
+
color: var(--violet-text-primary);
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
.violet-table .col-mono {
|
|
694
|
+
font-family: 'JetBrains Mono', monospace;
|
|
695
|
+
font-size: 13px;
|
|
696
|
+
color: var(--violet-text-secondary);
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
/* === LIGHT MODE === */
|
|
700
|
+
.light .violet-table thead th {
|
|
701
|
+
background: var(--violet-surface-1);
|
|
702
|
+
color: var(--violet-text-muted);
|
|
703
|
+
border-bottom-color: var(--violet-surface-3);
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
.light .violet-table tbody tr {
|
|
707
|
+
border-bottom-color: var(--violet-surface-3);
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
.light .violet-table tbody tr:hover {
|
|
711
|
+
background: var(--violet-surface-2);
|
|
712
|
+
}
|
|
713
|
+
```
|
|
714
|
+
|
|
715
|
+
### Toasts / Notifications
|
|
716
|
+
|
|
717
|
+
```css
|
|
718
|
+
/* === DARK MODE === */
|
|
719
|
+
.violet-toast {
|
|
720
|
+
font-family: 'IBM Plex Sans', sans-serif;
|
|
721
|
+
font-size: 14px;
|
|
722
|
+
background: var(--violet-surface-1);
|
|
723
|
+
border-radius: 0px;
|
|
724
|
+
border-left: 3px solid;
|
|
725
|
+
padding: 16px 20px;
|
|
726
|
+
box-shadow:
|
|
727
|
+
0 4px 24px rgba(0, 0, 0, 0.5),
|
|
728
|
+
0 0 1px rgba(168, 85, 247, 0.2);
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
.violet-toast-success {
|
|
732
|
+
border-left-color: var(--violet-green);
|
|
733
|
+
box-shadow:
|
|
734
|
+
0 4px 24px rgba(0, 0, 0, 0.5),
|
|
735
|
+
0 0 15px rgba(52, 211, 153, 0.1);
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
.violet-toast-error {
|
|
739
|
+
border-left-color: var(--violet-magenta);
|
|
740
|
+
box-shadow:
|
|
741
|
+
0 4px 24px rgba(0, 0, 0, 0.5),
|
|
742
|
+
0 0 15px rgba(244, 114, 182, 0.1);
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
.violet-toast-warning {
|
|
746
|
+
border-left-color: var(--violet-yellow);
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/* === LIGHT MODE === */
|
|
750
|
+
.light .violet-toast {
|
|
751
|
+
background: var(--violet-surface-0);
|
|
752
|
+
box-shadow: 0 4px 16px rgba(124, 58, 237, 0.08);
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
.light .violet-toast-success {
|
|
756
|
+
box-shadow: 0 4px 16px rgba(5, 150, 105, 0.06);
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
.light .violet-toast-error {
|
|
760
|
+
box-shadow: 0 4px 16px rgba(225, 29, 72, 0.06);
|
|
761
|
+
}
|
|
762
|
+
```
|
|
763
|
+
|
|
764
|
+
### Modals / Dialogs
|
|
765
|
+
|
|
766
|
+
```css
|
|
767
|
+
/* === DARK MODE === */
|
|
768
|
+
.violet-modal-overlay {
|
|
769
|
+
background: rgba(8, 6, 14, 0.85);
|
|
770
|
+
backdrop-filter: blur(8px);
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
.violet-modal {
|
|
774
|
+
background: var(--violet-surface-0);
|
|
775
|
+
border: 1px solid var(--violet-surface-3);
|
|
776
|
+
border-radius: 0px;
|
|
777
|
+
box-shadow:
|
|
778
|
+
0 24px 80px rgba(0, 0, 0, 0.6),
|
|
779
|
+
0 0 1px rgba(168, 85, 247, 0.3);
|
|
780
|
+
max-width: 520px;
|
|
781
|
+
width: 100%;
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
.violet-modal-header {
|
|
785
|
+
padding: 20px 24px;
|
|
786
|
+
border-bottom: 1px solid var(--violet-surface-3);
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
.violet-modal-title {
|
|
790
|
+
font-family: 'JetBrains Mono', monospace;
|
|
791
|
+
font-size: 18px;
|
|
792
|
+
font-weight: 700;
|
|
793
|
+
color: var(--violet-text-primary);
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
/* === LIGHT MODE === */
|
|
797
|
+
.light .violet-modal-overlay {
|
|
798
|
+
background: rgba(248, 245, 255, 0.75);
|
|
799
|
+
backdrop-filter: blur(8px);
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
.light .violet-modal {
|
|
803
|
+
background: var(--violet-surface-0);
|
|
804
|
+
border-color: var(--violet-surface-3);
|
|
805
|
+
box-shadow:
|
|
806
|
+
0 16px 48px rgba(124, 58, 237, 0.1),
|
|
807
|
+
0 0 0 1px rgba(124, 58, 237, 0.06);
|
|
808
|
+
}
|
|
809
|
+
```
|
|
810
|
+
|
|
811
|
+
### Scrollbar Styling
|
|
812
|
+
|
|
813
|
+
```css
|
|
814
|
+
/* === DARK MODE === */
|
|
815
|
+
.violet-scrollbar::-webkit-scrollbar {
|
|
816
|
+
width: 6px;
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
.violet-scrollbar::-webkit-scrollbar-track {
|
|
820
|
+
background: var(--violet-void);
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
.violet-scrollbar::-webkit-scrollbar-thumb {
|
|
824
|
+
background: var(--violet-surface-3);
|
|
825
|
+
border-radius: 0px;
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
.violet-scrollbar::-webkit-scrollbar-thumb:hover {
|
|
829
|
+
background: var(--violet-neon-muted);
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
/* === LIGHT MODE === */
|
|
833
|
+
.light .violet-scrollbar::-webkit-scrollbar-track {
|
|
834
|
+
background: var(--violet-void);
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
.light .violet-scrollbar::-webkit-scrollbar-thumb {
|
|
838
|
+
background: var(--violet-surface-3);
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
.light .violet-scrollbar::-webkit-scrollbar-thumb:hover {
|
|
842
|
+
background: var(--violet-neon-muted);
|
|
843
|
+
}
|
|
844
|
+
```
|
|
845
|
+
|
|
846
|
+
---
|
|
847
|
+
|
|
848
|
+
## 5. Special Effects
|
|
849
|
+
|
|
850
|
+
### Scanline Overlay (Dark Mode Only)
|
|
851
|
+
|
|
852
|
+
The CRT scanline effect only on dark mode. Light mode is clean and crisp.
|
|
853
|
+
|
|
854
|
+
```css
|
|
855
|
+
.violet-scanlines::after {
|
|
856
|
+
content: '';
|
|
857
|
+
position: fixed;
|
|
858
|
+
top: 0;
|
|
859
|
+
left: 0;
|
|
860
|
+
width: 100%;
|
|
861
|
+
height: 100%;
|
|
862
|
+
background: repeating-linear-gradient(
|
|
863
|
+
0deg,
|
|
864
|
+
transparent,
|
|
865
|
+
transparent 2px,
|
|
866
|
+
rgba(0, 0, 0, 0.03) 2px,
|
|
867
|
+
rgba(0, 0, 0, 0.03) 4px
|
|
868
|
+
);
|
|
869
|
+
pointer-events: none;
|
|
870
|
+
z-index: 9999;
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
/* Disable in light mode */
|
|
874
|
+
.light .violet-scanlines::after {
|
|
875
|
+
display: none;
|
|
876
|
+
}
|
|
877
|
+
```
|
|
878
|
+
|
|
879
|
+
### Neon Pulse Animation (Dark Mode)
|
|
880
|
+
|
|
881
|
+
```css
|
|
882
|
+
@keyframes violet-pulse {
|
|
883
|
+
0%, 100% {
|
|
884
|
+
box-shadow:
|
|
885
|
+
0 0 5px rgba(168, 85, 247, 0.4),
|
|
886
|
+
0 0 20px rgba(168, 85, 247, 0.15);
|
|
887
|
+
}
|
|
888
|
+
50% {
|
|
889
|
+
box-shadow:
|
|
890
|
+
0 0 10px rgba(168, 85, 247, 0.6),
|
|
891
|
+
0 0 40px rgba(168, 85, 247, 0.25),
|
|
892
|
+
0 0 80px rgba(168, 85, 247, 0.1);
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
.violet-pulse {
|
|
897
|
+
animation: violet-pulse 2s ease-in-out infinite;
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
/* Light mode: subtle shadow pulse instead of glow */
|
|
901
|
+
@keyframes violet-pulse-light {
|
|
902
|
+
0%, 100% {
|
|
903
|
+
box-shadow: 0 1px 3px rgba(124, 58, 237, 0.2);
|
|
904
|
+
}
|
|
905
|
+
50% {
|
|
906
|
+
box-shadow: 0 2px 8px rgba(124, 58, 237, 0.3);
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
.light .violet-pulse {
|
|
911
|
+
animation: violet-pulse-light 2s ease-in-out infinite;
|
|
912
|
+
}
|
|
913
|
+
```
|
|
914
|
+
|
|
915
|
+
### Typing Cursor Blink
|
|
916
|
+
|
|
917
|
+
```css
|
|
918
|
+
@keyframes blink {
|
|
919
|
+
0%, 100% { opacity: 1; }
|
|
920
|
+
50% { opacity: 0; }
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
.violet-cursor::after {
|
|
924
|
+
content: '_';
|
|
925
|
+
color: var(--violet-neon);
|
|
926
|
+
animation: blink 1s step-end infinite;
|
|
927
|
+
margin-left: 2px;
|
|
928
|
+
}
|
|
929
|
+
```
|
|
930
|
+
|
|
931
|
+
### Grid Background Pattern
|
|
932
|
+
|
|
933
|
+
```css
|
|
934
|
+
/* Dark: faint violet dot-grid */
|
|
935
|
+
.violet-grid-bg {
|
|
936
|
+
background-image: radial-gradient(
|
|
937
|
+
circle,
|
|
938
|
+
rgba(168, 85, 247, 0.06) 1px,
|
|
939
|
+
transparent 1px
|
|
940
|
+
);
|
|
941
|
+
background-size: 24px 24px;
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
/* Light: even subtler lavender dot-grid */
|
|
945
|
+
.light .violet-grid-bg {
|
|
946
|
+
background-image: radial-gradient(
|
|
947
|
+
circle,
|
|
948
|
+
rgba(124, 58, 237, 0.04) 1px,
|
|
949
|
+
transparent 1px
|
|
950
|
+
);
|
|
951
|
+
background-size: 24px 24px;
|
|
952
|
+
}
|
|
953
|
+
```
|
|
954
|
+
|
|
955
|
+
---
|
|
956
|
+
|
|
957
|
+
## 6. Tailwind v4 Theme Configuration
|
|
958
|
+
|
|
959
|
+
```css
|
|
960
|
+
@import "tailwindcss";
|
|
961
|
+
|
|
962
|
+
@theme {
|
|
963
|
+
/* === DARK MODE (default) === */
|
|
964
|
+
|
|
965
|
+
/* Violet Terminal Colors */
|
|
966
|
+
--color-void: #08060E;
|
|
967
|
+
--color-surface-0: #0F0B19;
|
|
968
|
+
--color-surface-1: #161122;
|
|
969
|
+
--color-surface-2: #1E172E;
|
|
970
|
+
--color-surface-3: #2A2140;
|
|
971
|
+
|
|
972
|
+
--color-neon-violet: #A855F7;
|
|
973
|
+
--color-neon-violet-bright: #C084FC;
|
|
974
|
+
--color-neon-violet-muted: #7C3AED;
|
|
975
|
+
--color-neon-blue: #60A5FA;
|
|
976
|
+
--color-neon-magenta: #F472B6;
|
|
977
|
+
--color-neon-green: #34D399;
|
|
978
|
+
--color-neon-yellow: #FBBF24;
|
|
979
|
+
|
|
980
|
+
--color-neon-text-primary: #EDE9FE;
|
|
981
|
+
--color-neon-text-secondary: #9F8BBF;
|
|
982
|
+
--color-neon-text-muted: #5B4A73;
|
|
983
|
+
|
|
984
|
+
/* === LIGHT MODE === */
|
|
985
|
+
--color-light-void: #F8F5FF;
|
|
986
|
+
--color-light-surface-0: #FFFFFF;
|
|
987
|
+
--color-light-surface-1: #F3EEFF;
|
|
988
|
+
--color-light-surface-2: #EDE5FC;
|
|
989
|
+
--color-light-surface-3: #DDD1F5;
|
|
990
|
+
|
|
991
|
+
--color-light-accent: #7C3AED;
|
|
992
|
+
--color-light-accent-bold: #6D28D9;
|
|
993
|
+
--color-light-accent-soft: #8B5CF6;
|
|
994
|
+
|
|
995
|
+
--color-light-text-primary: #1E103A;
|
|
996
|
+
--color-light-text-secondary: #5B4A73;
|
|
997
|
+
--color-light-text-muted: #9F8BBF;
|
|
998
|
+
|
|
999
|
+
/* Font families */
|
|
1000
|
+
--font-heading: 'JetBrains Mono', monospace;
|
|
1001
|
+
--font-body: 'IBM Plex Sans', sans-serif;
|
|
1002
|
+
--font-mono: 'JetBrains Mono', monospace;
|
|
1003
|
+
|
|
1004
|
+
/* Border radius tokens */
|
|
1005
|
+
--radius-sharp: 0px;
|
|
1006
|
+
--radius-terminal: 2px;
|
|
1007
|
+
--radius-pill: 9999px;
|
|
1008
|
+
}
|
|
1009
|
+
```
|
|
1010
|
+
|
|
1011
|
+
### Tailwind Utility Examples
|
|
1012
|
+
|
|
1013
|
+
```html
|
|
1014
|
+
<!-- === DARK MODE === -->
|
|
1015
|
+
|
|
1016
|
+
<!-- Page title with violet glow -->
|
|
1017
|
+
<h1 class="font-heading text-[40px] font-extrabold uppercase tracking-tight text-neon-violet
|
|
1018
|
+
[text-shadow:0_0_7px_rgba(168,85,247,0.6),0_0_20px_rgba(168,85,247,0.3)]">
|
|
1019
|
+
DASHBOARD_
|
|
1020
|
+
</h1>
|
|
1021
|
+
|
|
1022
|
+
<!-- Primary button with violet glow -->
|
|
1023
|
+
<button class="font-mono text-[13px] font-semibold uppercase tracking-wider
|
|
1024
|
+
bg-neon-violet text-white rounded-pill px-7 py-2.5
|
|
1025
|
+
shadow-[0_0_5px_rgba(168,85,247,0.4),0_0_20px_rgba(168,85,247,0.15)]
|
|
1026
|
+
hover:shadow-[0_0_8px_rgba(168,85,247,0.6),0_0_30px_rgba(168,85,247,0.3)]
|
|
1027
|
+
transition-all duration-200">
|
|
1028
|
+
EXECUTE
|
|
1029
|
+
</button>
|
|
1030
|
+
|
|
1031
|
+
<!-- Sharp card with violet accent -->
|
|
1032
|
+
<div class="bg-surface-0 border border-surface-3 rounded-sharp p-6 border-t-2 border-t-neon-violet">
|
|
1033
|
+
<h3 class="font-heading text-xl font-semibold text-neon-text-primary">Card Title</h3>
|
|
1034
|
+
<p class="font-body text-[15px] text-neon-text-secondary mt-2">Card content here.</p>
|
|
1035
|
+
</div>
|
|
1036
|
+
|
|
1037
|
+
<!-- Terminal input with violet focus -->
|
|
1038
|
+
<input class="font-mono text-sm bg-void border border-surface-3 rounded-terminal
|
|
1039
|
+
text-neon-text-primary px-4 py-3
|
|
1040
|
+
focus:border-neon-violet focus:shadow-[0_0_0_1px_#A855F7,0_0_15px_rgba(168,85,247,0.15)]
|
|
1041
|
+
focus:outline-none caret-neon-violet
|
|
1042
|
+
placeholder:text-neon-text-muted placeholder:italic"
|
|
1043
|
+
placeholder="type command..." />
|
|
1044
|
+
|
|
1045
|
+
<!-- Violet badge -->
|
|
1046
|
+
<span class="font-mono text-[11px] font-medium uppercase tracking-wider
|
|
1047
|
+
text-neon-violet-bright bg-neon-violet/10 border border-neon-violet/25
|
|
1048
|
+
rounded-pill px-3 py-1">
|
|
1049
|
+
ACTIVE
|
|
1050
|
+
</span>
|
|
1051
|
+
|
|
1052
|
+
<!-- === LIGHT MODE === -->
|
|
1053
|
+
|
|
1054
|
+
<!-- Page title (clean, no glow) -->
|
|
1055
|
+
<h1 class="font-heading text-[40px] font-extrabold uppercase tracking-tight text-light-accent">
|
|
1056
|
+
DASHBOARD_
|
|
1057
|
+
</h1>
|
|
1058
|
+
|
|
1059
|
+
<!-- Primary button (solid, subtle shadow) -->
|
|
1060
|
+
<button class="font-mono text-[13px] font-semibold uppercase tracking-wider
|
|
1061
|
+
bg-light-accent text-white rounded-pill px-7 py-2.5
|
|
1062
|
+
shadow-[0_1px_3px_rgba(124,58,237,0.3)]
|
|
1063
|
+
hover:bg-light-accent-bold hover:shadow-[0_2px_8px_rgba(124,58,237,0.35)]
|
|
1064
|
+
transition-all duration-200">
|
|
1065
|
+
EXECUTE
|
|
1066
|
+
</button>
|
|
1067
|
+
|
|
1068
|
+
<!-- Card with lavender tint -->
|
|
1069
|
+
<div class="bg-light-surface-0 border border-light-surface-3 rounded-sharp p-6
|
|
1070
|
+
shadow-[0_1px_3px_rgba(124,58,237,0.04)]
|
|
1071
|
+
hover:shadow-[0_2px_12px_rgba(124,58,237,0.06)]">
|
|
1072
|
+
<h3 class="font-heading text-xl font-semibold text-light-text-primary">Card Title</h3>
|
|
1073
|
+
<p class="font-body text-[15px] text-light-text-secondary mt-2">Card content here.</p>
|
|
1074
|
+
</div>
|
|
1075
|
+
|
|
1076
|
+
<!-- Input with violet focus ring -->
|
|
1077
|
+
<input class="font-mono text-sm bg-white border border-light-surface-3 rounded-terminal
|
|
1078
|
+
text-light-text-primary px-4 py-3
|
|
1079
|
+
focus:border-light-accent focus:shadow-[0_0_0_2px_rgba(124,58,237,0.15)]
|
|
1080
|
+
focus:outline-none caret-light-accent
|
|
1081
|
+
placeholder:text-light-text-muted placeholder:italic"
|
|
1082
|
+
placeholder="type command..." />
|
|
1083
|
+
```
|
|
1084
|
+
|
|
1085
|
+
---
|
|
1086
|
+
|
|
1087
|
+
## 7. Inspiration References
|
|
1088
|
+
|
|
1089
|
+
| Source | What to Borrow |
|
|
1090
|
+
|---------------------------------|-------------------------------------------------------------------------|
|
|
1091
|
+
| **Neon Terminal (original)** | Shape language, monospace DNA, structural patterns |
|
|
1092
|
+
| **Synthwave '84 (VS Code)** | Purple/violet neon palette, dark void + glow aesthetic |
|
|
1093
|
+
| **Shades of Purple (terminal)**| Bold purple accent hierarchy, deep backgrounds |
|
|
1094
|
+
| **Linear (dark mode)** | Surface elevation system, tight spacing, minimal borders |
|
|
1095
|
+
| **Linear (light mode)** | Clean lavender-tinted surfaces, sophisticated restraint |
|
|
1096
|
+
| **Figma (light mode)** | Purple accent on white surfaces, lavender hover states |
|
|
1097
|
+
| **Warp Terminal** | Block-based UI, monospace-first, input styling |
|
|
1098
|
+
| **Notion (light mode)** | Clean light backgrounds with colorful accents, subtle shadows |
|
|
1099
|
+
| **Stripe Dashboard** | Purple accent + white surface pairing, elegant light theme |
|
|
1100
|
+
|
|
1101
|
+
---
|
|
1102
|
+
|
|
1103
|
+
## 8. Key Design Principles
|
|
1104
|
+
|
|
1105
|
+
1. **Terminal DNA preserved:** All headings, labels, navigation, badges, and interactive elements use JetBrains Mono. Only body text uses sans-serif. This is non-negotiable across all Neon Terminal variants.
|
|
1106
|
+
2. **Violet is the new cyan:** Where Neon Terminal uses cyan, Neon Violet uses electric purple (#A855F7 dark / #7C3AED light). The accent hierarchy remains identical -- only the hue shifts.
|
|
1107
|
+
3. **Glow in dark, shadow in light:** Dark mode gets neon glow effects (text-shadow, box-shadow with high spread and blur). Light mode gets elegant violet-tinted shadows (subtle, no glow). The effects serve the same role -- indicating focus and importance -- but through mode-appropriate techniques.
|
|
1108
|
+
4. **Lavender, not inverted:** The light mode is NOT an inverted dark mode. It uses intentionally designed lavender-tinted surfaces (#F8F5FF page, #F3EEFF cards, #EDE5FC hovers) that create warmth without garish purple. Think "if Stripe went purple."
|
|
1109
|
+
5. **Sharp vs. pill tension:** Same as original. Cards/panels = 0px radius (industrial). Buttons/badges = 9999px (futuristic). This contrast is a family trait.
|
|
1110
|
+
6. **Uppercase everything interactive:** Buttons, badges, labels, nav headers -- all uppercase monospace. The command-line energy persists in both modes.
|
|
1111
|
+
7. **Color is signal:** Violet = primary, blue = info, pink/rose = danger, green = success, amber = warning. Never decorative.
|
|
1112
|
+
8. **Light mode is first-class:** The light mode is designed with the same care as dark mode. Proper contrast ratios, intentional surface layering, appropriate semantic colors. Not an afterthought.
|
|
1113
|
+
|
|
1114
|
+
---
|
|
1115
|
+
|
|
1116
|
+
## 9. Mode-Specific Summary
|
|
1117
|
+
|
|
1118
|
+
### Dark Mode At a Glance
|
|
1119
|
+
|
|
1120
|
+
- **Background:** Deep purple-tinted void (#08060E)
|
|
1121
|
+
- **Accent:** Electric violet (#A855F7) with neon glow
|
|
1122
|
+
- **Cards:** Dark surfaces with subtle violet borders
|
|
1123
|
+
- **Focus:** Violet glow rings and shadows
|
|
1124
|
+
- **Effects:** Scanlines, neon pulse, grid dots
|
|
1125
|
+
- **Feel:** Synthwave command center. Confident. Ultraviolet darkness.
|
|
1126
|
+
|
|
1127
|
+
### Light Mode At a Glance
|
|
1128
|
+
|
|
1129
|
+
- **Background:** Soft lavender (#F8F5FF)
|
|
1130
|
+
- **Accent:** Deep violet (#7C3AED) -- solid, no glow
|
|
1131
|
+
- **Cards:** White with subtle lavender-tinted borders
|
|
1132
|
+
- **Focus:** Clean violet focus rings with subtle shadow
|
|
1133
|
+
- **Effects:** No scanlines. Subtle dot grid. Clean shadows.
|
|
1134
|
+
- **Feel:** Sophisticated purple tech dashboard. If Linear and Stripe had a purple child.
|