@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.
Files changed (103) hide show
  1. package/README.md +77 -0
  2. package/app/components/form/inputs/CategoryTreeInput.vue +154 -0
  3. package/app/components/form/inputs/CategoryTreePicker.vue +355 -0
  4. package/app/components/form/inputs/NestedDraggable.vue +217 -0
  5. package/app/components/form/inputs/QuicklinksInput.vue +186 -0
  6. package/app/lang/de/motor-admin/CLAUDE.md +21 -0
  7. package/app/lang/de/motor-admin/ai_system_prompts.json +12 -0
  8. package/app/lang/de/motor-admin/categories.json +12 -0
  9. package/app/lang/de/motor-admin/category_trees.json +14 -0
  10. package/app/lang/de/motor-admin/clients.json +26 -0
  11. package/app/lang/de/motor-admin/config_variables.json +14 -0
  12. package/app/lang/de/motor-admin/domains.json +19 -0
  13. package/app/lang/de/motor-admin/email_templates.json +38 -0
  14. package/app/lang/de/motor-admin/global.json +5 -0
  15. package/app/lang/de/motor-admin/languages.json +16 -0
  16. package/app/lang/de/motor-admin/permissions.json +14 -0
  17. package/app/lang/de/motor-admin/roles.json +15 -0
  18. package/app/lang/de/motor-admin/users.json +22 -0
  19. package/app/lang/en/motor-admin/CLAUDE.md +7 -0
  20. package/app/lang/en/motor-admin/ai_system_prompts.json +12 -0
  21. package/app/lang/en/motor-admin/categories.json +12 -0
  22. package/app/lang/en/motor-admin/category_trees.json +14 -0
  23. package/app/lang/en/motor-admin/clients.json +26 -0
  24. package/app/lang/en/motor-admin/config_variables.json +14 -0
  25. package/app/lang/en/motor-admin/domains.json +18 -0
  26. package/app/lang/en/motor-admin/email_templates.json +33 -0
  27. package/app/lang/en/motor-admin/global.json +5 -0
  28. package/app/lang/en/motor-admin/languages.json +16 -0
  29. package/app/lang/en/motor-admin/permissions.json +14 -0
  30. package/app/lang/en/motor-admin/roles.json +15 -0
  31. package/app/lang/en/motor-admin/users.json +22 -0
  32. package/app/pages/dashboard.vue +5 -0
  33. package/app/pages/index.vue +39 -0
  34. package/app/pages/login.vue +85 -0
  35. package/app/pages/motor-admin/ai-system-prompts/CLAUDE.md +7 -0
  36. package/app/pages/motor-admin/ai-system-prompts/[id]/edit.vue +48 -0
  37. package/app/pages/motor-admin/ai-system-prompts/create.vue +40 -0
  38. package/app/pages/motor-admin/ai-system-prompts/index.vue +68 -0
  39. package/app/pages/motor-admin/category-trees/CLAUDE.md +7 -0
  40. package/app/pages/motor-admin/category-trees/[id]/CLAUDE.md +7 -0
  41. package/app/pages/motor-admin/category-trees/[id]/categories/[categoryId]/edit.vue +73 -0
  42. package/app/pages/motor-admin/category-trees/[id]/categories/create.vue +64 -0
  43. package/app/pages/motor-admin/category-trees/[id]/edit.vue +45 -0
  44. package/app/pages/motor-admin/category-trees/[id]/index.vue +81 -0
  45. package/app/pages/motor-admin/category-trees/create.vue +37 -0
  46. package/app/pages/motor-admin/category-trees/index.vue +54 -0
  47. package/app/pages/motor-admin/clients/CLAUDE.md +11 -0
  48. package/app/pages/motor-admin/clients/[id]/CLAUDE.md +11 -0
  49. package/app/pages/motor-admin/clients/[id]/edit.vue +45 -0
  50. package/app/pages/motor-admin/clients/create.vue +37 -0
  51. package/app/pages/motor-admin/clients/index.vue +46 -0
  52. package/app/pages/motor-admin/config-variables/CLAUDE.md +11 -0
  53. package/app/pages/motor-admin/config-variables/[id]/edit.vue +44 -0
  54. package/app/pages/motor-admin/config-variables/create.vue +36 -0
  55. package/app/pages/motor-admin/config-variables/index.vue +66 -0
  56. package/app/pages/motor-admin/domains/CLAUDE.md +11 -0
  57. package/app/pages/motor-admin/domains/[id]/edit.vue +54 -0
  58. package/app/pages/motor-admin/domains/create.vue +46 -0
  59. package/app/pages/motor-admin/domains/index.vue +98 -0
  60. package/app/pages/motor-admin/email-templates/CLAUDE.md +12 -0
  61. package/app/pages/motor-admin/email-templates/[id]/CLAUDE.md +7 -0
  62. package/app/pages/motor-admin/email-templates/[id]/edit.vue +56 -0
  63. package/app/pages/motor-admin/email-templates/create.vue +48 -0
  64. package/app/pages/motor-admin/email-templates/index.vue +67 -0
  65. package/app/pages/motor-admin/index.vue +12 -0
  66. package/app/pages/motor-admin/languages/CLAUDE.md +7 -0
  67. package/app/pages/motor-admin/languages/[id]/edit.vue +44 -0
  68. package/app/pages/motor-admin/languages/create.vue +36 -0
  69. package/app/pages/motor-admin/languages/index.vue +44 -0
  70. package/app/pages/motor-admin/permission-groups/CLAUDE.md +14 -0
  71. package/app/pages/motor-admin/permission-groups/[id]/CLAUDE.md +11 -0
  72. package/app/pages/motor-admin/permission-groups/[id]/edit.vue +49 -0
  73. package/app/pages/motor-admin/permission-groups/create.vue +41 -0
  74. package/app/pages/motor-admin/permission-groups/index.vue +43 -0
  75. package/app/pages/motor-admin/roles/CLAUDE.md +7 -0
  76. package/app/pages/motor-admin/roles/[id]/edit.vue +47 -0
  77. package/app/pages/motor-admin/roles/create.vue +40 -0
  78. package/app/pages/motor-admin/roles/index.vue +45 -0
  79. package/app/pages/motor-admin/theme-preview/CLAUDE.md +7 -0
  80. package/app/pages/motor-admin/theme-preview/index.vue +4801 -0
  81. package/app/pages/motor-admin/theme-preview/themes/CLAUDE.md +11 -0
  82. package/app/pages/motor-admin/theme-preview/themes/asymmetric-brutalist.md +381 -0
  83. package/app/pages/motor-admin/theme-preview/themes/bold-modern.md +231 -0
  84. package/app/pages/motor-admin/theme-preview/themes/geometric-minimal.md +778 -0
  85. package/app/pages/motor-admin/theme-preview/themes/gradient-flow.md +1057 -0
  86. package/app/pages/motor-admin/theme-preview/themes/liquid-glass.md +823 -0
  87. package/app/pages/motor-admin/theme-preview/themes/neon-amber.md +1223 -0
  88. package/app/pages/motor-admin/theme-preview/themes/neon-terminal.md +779 -0
  89. package/app/pages/motor-admin/theme-preview/themes/neon-violet.md +1134 -0
  90. package/app/pages/motor-admin/theme-preview/themes/professional-clean.md +232 -0
  91. package/app/pages/motor-admin/theme-preview/themes/refined-brutalist.md +462 -0
  92. package/app/pages/motor-admin/theme-preview/themes/wild-card.md +263 -0
  93. package/app/pages/motor-admin/users/CLAUDE.md +17 -0
  94. package/app/pages/motor-admin/users/[id]/CLAUDE.md +11 -0
  95. package/app/pages/motor-admin/users/[id]/edit.vue +83 -0
  96. package/app/pages/motor-admin/users/create.vue +40 -0
  97. package/app/pages/motor-admin/users/index.vue +66 -0
  98. package/app/pages/profile.vue +363 -0
  99. package/app/pages/search.vue +91 -0
  100. package/app/types/generated/form-meta.ts +258 -0
  101. package/app/types/generated/grid-meta.ts +172 -0
  102. package/nuxt.config.ts +1 -0
  103. package/package.json +26 -0
@@ -0,0 +1,11 @@
1
+ <claude-mem-context>
2
+ # Recent Activity
3
+
4
+ <!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
5
+
6
+ ### Feb 12, 2026
7
+
8
+ | ID | Time | T | Title | Read |
9
+ |----|------|---|-------|------|
10
+ | #24590 | 5:12 PM | 🟣 | Neon Violet Theme Specification Complete with Dual-Mode Support | ~623 |
11
+ </claude-mem-context>
@@ -0,0 +1,381 @@
1
+ # Asymmetric Brutalist Theme
2
+
3
+ > A raw, high-contrast admin panel theme that breaks conventional UI symmetry. Thick black borders, hard offset shadows, one-sided rounded corners, and oversized typography create an interface that feels tactile, bold, and unapologetically expressive. Inspired by neobrutalist web design, Arc Browser's colored borders, and Notion's content-first hierarchy.
4
+
5
+ ---
6
+
7
+ ## Color Palette
8
+
9
+ ### Primary: Black + Off-White (The Foundation)
10
+
11
+ True brutalism starts with maximum contrast. Stark black borders, shadows, and text against warm off-white backgrounds form the structural skeleton. Every other color is a deliberate accent punched into this monochrome frame.
12
+
13
+ | Token | Tailwind Class | Hex | Usage |
14
+ |------------------|------------------|-----------|-----------------------------------------|
15
+ | base-black | `neutral-950` | #09090b | Borders, shadows, primary text |
16
+ | base-white | `neutral-50` | #fafafa | Page background, card fills |
17
+ | warm-white | `stone-50` | #fafaf9 | Alternate background, sidebar bg |
18
+ | off-white | `stone-100` | #f5f5f4 | Card hover states, table stripes |
19
+ | border-gray | `stone-300` | #d6d3d1 | Secondary borders, dividers |
20
+
21
+ ### Accent: Electric Lime (Tailwind `lime`)
22
+
23
+ A jarring, high-energy accent that screams against black. Used sparingly for active states, CTAs, and interactive highlights. This is not a polite green -- it is neon, aggressive, impossible to ignore.
24
+
25
+ | Token | Tailwind Class | Hex | Usage |
26
+ |------------------|------------------|-----------|-----------------------------------------|
27
+ | accent-300 | `lime-300` | #bef264 | Active sidebar item bg, highlight fills |
28
+ | **accent-400** | **`lime-400`** | **#a3e635** | **Primary CTA buttons, active states**|
29
+ | accent-500 | `lime-500` | #84cc16 | Hover on accent elements |
30
+ | accent-600 | `lime-600` | #65a30d | Pressed / active accent |
31
+
32
+ ### Secondary Accent: Hot Pink (Tailwind `pink`)
33
+
34
+ A secondary punch color for destructive actions, notifications, and badges. Creates electric tension when paired with lime.
35
+
36
+ | Token | Tailwind Class | Hex | Usage |
37
+ |------------------|------------------|-----------|-----------------------------------------|
38
+ | secondary-400 | `pink-400` | #f472b6 | Notification badges, warning highlights |
39
+ | **secondary-500**| **`pink-500`** | **#ec4899** | **Destructive buttons, error states** |
40
+ | secondary-600 | `pink-600` | #db2777 | Hover on destructive elements |
41
+
42
+ ### Semantic Colors
43
+
44
+ | Purpose | Color | Hex | Notes |
45
+ |-----------|-------------------|-----------|------------------------------------------|
46
+ | Success | `lime-400` | #a3e635 | Ties to primary accent intentionally |
47
+ | Warning | `amber-400` | #fbbf24 | High visibility against black borders |
48
+ | Error | `pink-500` | #ec4899 | Ties to secondary accent |
49
+ | Info | `sky-400` | #38bdf8 | Cool contrast against warm palette |
50
+
51
+ ---
52
+
53
+ ## Typography
54
+
55
+ ### Font Pairing: Space Grotesk (Oversized) + JetBrains Mono
56
+
57
+ **Heading Font: Space Grotesk** (Google Fonts)
58
+ - Style: Geometric grotesque with quirky letterforms -- the slight irregularities feel intentionally raw
59
+ - Weights: **700 (Bold)** exclusively for headings. No medium, no light. Bold or nothing.
60
+ - Use for: Page titles at MASSIVE sizes, section headers, stat numbers, sidebar labels, button text
61
+ - Character: Technical, blunt, unapologetic. The geometric shapes pair perfectly with the hard edges of brutalist borders.
62
+
63
+ **Body + Code Font: JetBrains Mono** (Google Fonts)
64
+ - Style: Monospaced typeface originally designed for code, repurposed here for ALL body text
65
+ - Weights: 400 (Regular) for body, 500 (Medium) for labels and emphasis
66
+ - Use for: Body text, table data, form inputs, metadata, descriptions -- everything that isn't a heading
67
+ - Character: Using a monospaced font for body text is a deliberate brutalist choice. It references raw HTML, terminal output, the "undesigned" web. Every character occupies equal space, creating a visible grid rhythm.
68
+
69
+ ### Google Fonts Import
70
+
71
+ ```
72
+ https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&family=Space+Grotesk:wght@700&display=swap
73
+ ```
74
+
75
+ ### Type Scale (OVERSIZED)
76
+
77
+ This theme deliberately breaks the "14-16px body text" convention. Everything is bigger.
78
+
79
+ | Element | Font | Weight | Size (rem) | Size (px) | Tracking | Notes |
80
+ |-----------------------|-----------------|--------|-------------|-----------|--------------|-------------------------------------|
81
+ | Page title (h1) | Space Grotesk | 700 | **3.0** | **48px** | -0.04em | MASSIVE. Dominates the viewport. |
82
+ | Section title (h2) | Space Grotesk | 700 | **2.0** | **32px** | -0.03em | Still commanding. |
83
+ | Card header (h3) | Space Grotesk | 700 | **1.375** | **22px** | -0.02em | Bold only, no medium weight. |
84
+ | Stat number | Space Grotesk | 700 | **3.75** | **60px** | -0.05em | Enormous KPI numbers. |
85
+ | Body text | JetBrains Mono | 400 | **1.0** | **16px** | 0 | Monospaced, grid-aligned. |
86
+ | Label | JetBrains Mono | 500 | **0.8125** | **13px** | 0.05em | UPPERCASE, letterspaced. |
87
+ | Small / caption | JetBrains Mono | 400 | 0.75 | 12px | 0.02em | Metadata, timestamps. |
88
+ | Nav item (sidebar) | Space Grotesk | 700 | **1.125** | **18px** | -0.01em | Bold nav, bigger than usual. |
89
+ | Button text | Space Grotesk | 700 | **1.0** | **16px** | 0.02em | UPPERCASE on primary buttons. |
90
+
91
+ ---
92
+
93
+ ## Shape Language
94
+
95
+ ### The Core Idea: Asymmetric Corners
96
+
97
+ Every shape in this theme has **intentional asymmetry**. No element has four matching corners. This is the defining visual signature -- it makes the entire interface feel off-kilter, hand-crafted, and confrontational.
98
+
99
+ ### Border Radius Recipes
100
+
101
+ | Shape Name | CSS `border-radius` | Tailwind (approximate) | Used On |
102
+ |----------------------|----------------------------------------|-----------------------------------------------|-------------------------------|
103
+ | **Slash Card** | `0 24px 0 24px` | `rounded-none rounded-tr-3xl rounded-bl-3xl` | Cards, modals, dialogs |
104
+ | **Tab Shape** | `16px 16px 0 0` | `rounded-t-2xl rounded-b-none` | Tab bars, header sections |
105
+ | **Pill-Left** | `9999px 4px 4px 9999px` | `rounded-l-full rounded-r-sm` | Primary buttons |
106
+ | **Pill-Right** | `4px 9999px 9999px 4px` | `rounded-l-sm rounded-r-full` | Secondary / ghost buttons |
107
+ | **Notch Top-Left** | `24px 0 0 0` | `rounded-tl-3xl` | Sidebar active indicator |
108
+ | **Bottom-Heavy** | `0 0 16px 16px` | `rounded-b-2xl rounded-t-none` | Dropdown menus, popovers |
109
+ | **Sharp** | `0` | `rounded-none` | Inputs, table cells, badges |
110
+
111
+ ### Thick Borders (The Brutalist Signature)
112
+
113
+ Every interactive element has a visible, thick black border. No subtle 1px hairlines here.
114
+
115
+ | Element | Border | CSS |
116
+ |----------------|---------------------------------------------|---------------------------------------|
117
+ | Cards | 3px solid black | `border-[3px] border-neutral-950` |
118
+ | Buttons | 3px solid black | `border-[3px] border-neutral-950` |
119
+ | Inputs | 3px solid black | `border-[3px] border-neutral-950` |
120
+ | Sidebar | Right edge: 3px solid black | `border-r-[3px] border-neutral-950` |
121
+ | Table | 2px solid black on all cells | `border-2 border-neutral-950` |
122
+ | Badges | 2px solid black | `border-2 border-neutral-950` |
123
+
124
+ ### Hard Offset Shadows (No Blur, No Subtlety)
125
+
126
+ The defining neobrutalist shadow: a solid-color rectangle offset from the element. Zero blur. Creates a tactile, sticker-like, pseudo-3D effect.
127
+
128
+ | Element | Shadow CSS | Tailwind Custom | Notes |
129
+ |----------------|---------------------------------------------|----------------------------------------|-------------------------------|
130
+ | Cards | `box-shadow: 6px 6px 0 0 #09090b` | `shadow-[6px_6px_0_0_#09090b]` | Strong 3D pop |
131
+ | Buttons (rest) | `box-shadow: 4px 4px 0 0 #09090b` | `shadow-[4px_4px_0_0_#09090b]` | Smaller offset |
132
+ | Buttons (hover)| `box-shadow: 2px 2px 0 0 #09090b` | `shadow-[2px_2px_0_0_#09090b]` | Shrinks on hover (pressed) |
133
+ | Buttons (active)| `box-shadow: 0 0 0 0 #09090b` | `shadow-none` | Fully pressed down |
134
+ | Inputs (focus) | `box-shadow: 4px 4px 0 0 #a3e635` | `shadow-[4px_4px_0_0_#a3e635]` | Lime shadow on focus |
135
+ | Modals | `box-shadow: 8px 8px 0 0 #09090b` | `shadow-[8px_8px_0_0_#09090b]` | Maximum depth for overlays |
136
+
137
+ ### Button Press Animation
138
+
139
+ Buttons translate down + right on hover/active to match the shrinking shadow, creating a physical "press" effect:
140
+
141
+ ```css
142
+ /* Rest state */
143
+ .btn-brutal {
144
+ box-shadow: 4px 4px 0 0 #09090b;
145
+ transform: translate(0, 0);
146
+ transition: all 0.1s ease;
147
+ }
148
+
149
+ /* Hover */
150
+ .btn-brutal:hover {
151
+ box-shadow: 2px 2px 0 0 #09090b;
152
+ transform: translate(2px, 2px);
153
+ }
154
+
155
+ /* Active (pressed) */
156
+ .btn-brutal:active {
157
+ box-shadow: 0 0 0 0 #09090b;
158
+ transform: translate(4px, 4px);
159
+ }
160
+ ```
161
+
162
+ ---
163
+
164
+ ## Component Styling Notes
165
+
166
+ ### Sidebar
167
+
168
+ - **Off-white background** (`bg-stone-50`) with a thick right border (`border-r-[3px] border-neutral-950`)
169
+ - Navigation items use Space Grotesk Bold at 18px -- bigger than typical admin sidebars
170
+ - **Active item**: `bg-lime-300` fill with `rounded-tl-3xl` (only top-left corner rounded) + `border-l-4 border-neutral-950` left accent
171
+ - **Hover item**: `bg-stone-100` with the same asymmetric radius
172
+ - Section labels: JetBrains Mono, UPPERCASE, letterspaced, `text-stone-400`, 13px
173
+ - Bottom of sidebar: thick horizontal rule (`border-t-[3px] border-neutral-950`) separating user profile area
174
+ - Sidebar width: **280px** (wider than typical 240px to accommodate larger text)
175
+ - Inspired by: Arc Browser's bold colored sidebar borders, Notion's content hierarchy
176
+
177
+ ### Buttons
178
+
179
+ - **Primary CTA**: `bg-lime-400 text-neutral-950 border-[3px] border-neutral-950` with `rounded-l-full rounded-r-sm` (pill on left, sharp on right). Uses Space Grotesk Bold UPPERCASE. Hard offset shadow.
180
+ - **Secondary**: `bg-neutral-50 text-neutral-950 border-[3px] border-neutral-950` with `rounded-l-sm rounded-r-full` (sharp on left, pill on right -- mirrors primary). Hard offset shadow.
181
+ - **Destructive**: `bg-pink-500 text-white border-[3px] border-neutral-950` with same pill-left shape as primary.
182
+ - **Ghost**: `bg-transparent text-neutral-950 border-[3px] border-neutral-950` with `rounded-none`. No shadow.
183
+ - All buttons: `px-8 py-3` (generous padding), min-height 48px
184
+ - Press animation on all buttons with shadows (see animation section above)
185
+
186
+ ### Cards
187
+
188
+ - `bg-white border-[3px] border-neutral-950` with **Slash Card** corners (`rounded-none rounded-tr-3xl rounded-bl-3xl`)
189
+ - Hard offset shadow: `shadow-[6px_6px_0_0_#09090b]`
190
+ - Card header: Space Grotesk Bold, 22px, with a thick bottom border (`border-b-[3px] border-neutral-950`) separating header from body
191
+ - Card body: generous padding `p-8` (32px)
192
+ - **Stat cards**: Background fill `bg-lime-300` with enormous 60px stat numbers in Space Grotesk Bold. Slash Card shape with black shadow.
193
+ - Hover state: shadow shifts to `shadow-[4px_4px_0_0_#09090b]` + `translate(2px, 2px)` -- subtle press effect on cards too
194
+ - No gradient. No subtle shadows. No soft edges. Raw.
195
+
196
+ ### Tables / Data Grids
197
+
198
+ - **Full grid lines**: Every cell has `border-2 border-neutral-950`. This is intentional -- brutalism shows structure.
199
+ - Header row: `bg-neutral-950 text-white` with Space Grotesk Bold. Inverted color scheme for maximum contrast.
200
+ - Header text: UPPERCASE, letterspaced (`tracking-wider`)
201
+ - Body cells: JetBrains Mono Regular, 16px. Monospaced data alignment is a feature, not a bug.
202
+ - Alternating rows: `even:bg-stone-50` -- subtle warmth
203
+ - Row hover: `bg-lime-100` highlight
204
+ - Action column: icon buttons with `border-2 border-neutral-950 rounded-none` and hover `bg-lime-300`
205
+ - Sort indicators: `text-pink-500` arrows
206
+
207
+ ### Form Inputs
208
+
209
+ - **Sharp corners** (`rounded-none`) -- inputs are intentionally angular while cards are asymmetric
210
+ - `border-[3px] border-neutral-950` thick black border
211
+ - Focus state: `border-lime-500` + `shadow-[4px_4px_0_0_#a3e635]` (lime offset shadow appears on focus)
212
+ - Placeholder text: JetBrains Mono, `text-stone-400`
213
+ - Labels: JetBrains Mono Medium, UPPERCASE, `tracking-wider`, positioned above input with `mb-2`
214
+ - Input padding: `px-4 py-3` (generous)
215
+ - Input text: JetBrains Mono Regular, 16px
216
+ - Select dropdowns: sharp corners with `border-[3px]`, dropdown panel uses **Bottom-Heavy** radius (`rounded-b-2xl rounded-t-none`)
217
+ - Checkbox / Radio: replaced with `w-6 h-6` squares/circles with `border-[3px] border-neutral-950`, checked fill `bg-lime-400`
218
+ - Error state: `border-pink-500` + `shadow-[4px_4px_0_0_#ec4899]` (pink offset shadow)
219
+
220
+ ### Badges / Tags
221
+
222
+ - **Completely sharp** (`rounded-none`) -- no pills, no rounded corners
223
+ - `border-2 border-neutral-950 px-3 py-1`
224
+ - Primary: `bg-lime-300 text-neutral-950`
225
+ - Danger: `bg-pink-500 text-white`
226
+ - Neutral: `bg-stone-200 text-neutral-950`
227
+ - Info: `bg-sky-300 text-neutral-950`
228
+ - Font: JetBrains Mono Medium, UPPERCASE, 13px, `tracking-wider`
229
+ - Look like tiny labels / stamps -- deliberately anti-pill
230
+
231
+ ### Notifications / Toasts
232
+
233
+ - `bg-white border-[3px] border-neutral-950` with hard offset shadow
234
+ - **Tab Shape** radius (`rounded-t-2xl rounded-b-none`) -- rounded top, flat bottom
235
+ - Left color bar: `border-l-[6px]` (extra thick) in semantic color
236
+ - Success: `border-l-[6px] border-lime-400`
237
+ - Error: `border-l-[6px] border-pink-500`
238
+ - Warning: `border-l-[6px] border-amber-400`
239
+ - Info: `border-l-[6px] border-sky-400`
240
+ - Toast text: JetBrains Mono, body size
241
+
242
+ ### Modals / Dialogs
243
+
244
+ - **Slash Card** shape with extra-heavy shadow: `shadow-[8px_8px_0_0_#09090b]`
245
+ - `border-[3px] border-neutral-950`
246
+ - Overlay: `bg-neutral-950/60` (dark, high opacity)
247
+ - Modal header: Space Grotesk Bold 32px with bottom border
248
+ - Close button: `rounded-none border-[3px] border-neutral-950` square button in top-right
249
+
250
+ ### Pagination
251
+
252
+ - Square buttons (`rounded-none`) with `border-2 border-neutral-950`
253
+ - Active page: `bg-neutral-950 text-white`
254
+ - Hover: `bg-lime-300`
255
+ - JetBrains Mono for page numbers
256
+
257
+ ---
258
+
259
+ ## Dark Mode Adjustments
260
+
261
+ | Element | Light Mode | Dark Mode |
262
+ |----------------------|------------------------------------|-----------------------------------------|
263
+ | Page background | `stone-50` (#fafaf9) | `neutral-950` (#09090b) |
264
+ | Card background | `white` | `neutral-900` (#171717) |
265
+ | Card border | `neutral-950` (3px) | `neutral-300` (3px) -- inverted borders |
266
+ | Hard shadow | `#09090b` (black) | `#d6d3d1` (stone-300) -- light shadows |
267
+ | Sidebar bg | `stone-50` | `neutral-900` |
268
+ | Sidebar border | `neutral-950` right border | `neutral-300` right border |
269
+ | Primary text | `neutral-950` | `stone-100` |
270
+ | Body text | `neutral-700` | `stone-300` |
271
+ | Heading text | `neutral-950` | `white` |
272
+ | Accent (lime) | `lime-400` | `lime-300` (slightly lighter) |
273
+ | Secondary (pink) | `pink-500` | `pink-400` |
274
+ | Table header | `neutral-950 bg, white text` | `neutral-800 bg, stone-100 text` |
275
+ | Input focus shadow | `#a3e635` (lime) | `#bef264` (lighter lime) |
276
+ | Active nav item | `bg-lime-300` | `bg-lime-400/20` (translucent) |
277
+
278
+ Key dark mode principle: **Invert the shadows.** In light mode, shadows are black on white. In dark mode, shadows become light stone on dark backgrounds, maintaining the same hard offset aesthetic but with inverted contrast.
279
+
280
+ ---
281
+
282
+ ## Spacing & Layout Principles
283
+
284
+ | Aspect | Value | Notes |
285
+ |----------------------|------------------------------------|-----------------------------------------|
286
+ | Page padding | `p-10` (40px) | More breathing room than typical admin |
287
+ | Card gap | `gap-8` (32px) | Generous spacing between cards |
288
+ | Card inner padding | `p-8` (32px) | Spacious card interiors |
289
+ | Section gap | `mt-12` (48px) | Clear section separation |
290
+ | Sidebar width | 280px | Wider for larger nav text |
291
+ | Content max-width | 1400px | Wide content area |
292
+ | Grid columns | 12-column grid | Standard but with bigger gutters |
293
+
294
+ ---
295
+
296
+ ## Mood & Inspiration
297
+
298
+ ### Visual Identity Keywords
299
+ Raw, tactile, confrontational, grid-structured, high-contrast, anti-corporate, expressive, physical
300
+
301
+ ### Inspiration References
302
+
303
+ - **Arc Browser** -- The thick colored border around the entire UI, bold sidebar design, and per-Space theming. Arc proves thick borders can feel premium, not clunky. Our sidebar takes Arc's "bold border as identity" concept and pushes it further with asymmetric corner shapes.
304
+
305
+ - **Raycast** -- The confidence of a focused, opinionated interface. Bold iconography with thicker strokes. Our oversized type and high-contrast palette share Raycast's "designed with conviction" ethos.
306
+
307
+ - **Notion** -- Content hierarchy through typography scale rather than decorative elements. Our oversized headings (48px page titles) and monospaced body text create hierarchy through pure typography, similar to how Notion lets content structure speak for itself.
308
+
309
+ - **Linear** -- Strict grid adherence, high contrast, minimal decoration. Linear's dark mode with vivid accent colors influenced our lime-on-black dark mode palette. The hard offset shadows are the brutalist inversion of Linear's subtle depth.
310
+
311
+ - **Neobrutalist Web Movement** -- The broader trend of thick black borders, offset shadows, bright accent colors, and monospaced fonts in web design. Sites like Gumroad's redesign and various indie SaaS tools pioneered this aesthetic.
312
+
313
+ ### What Makes This Theme "Asymmetric Brutalist"
314
+
315
+ 1. **Asymmetric corners** -- No element has four matching corners. Cards slash diagonally (top-right + bottom-left rounded), buttons are pill on one side and sharp on the other, dropdowns round at the bottom only. This is the single most distinctive element -- it makes every component feel intentionally off-balance.
316
+
317
+ 2. **Hard offset shadows** -- Zero-blur, solid-color shadows create a tactile, sticker/stamp effect. Elements feel like they are physically stacked on the page. The press animation reinforces this physical metaphor.
318
+
319
+ 3. **Thick black borders on everything** -- 3px black borders on every interactive element give the interface a visible skeleton. Nothing is hidden or subtle. The structure is the decoration.
320
+
321
+ 4. **Monospaced body text** -- Using JetBrains Mono for all body text is a deliberately transgressive choice for an admin panel. It references terminal output and raw HTML, reinforcing the brutalist ethos while providing excellent data alignment in tables.
322
+
323
+ 5. **Oversized typography** -- 48px page titles and 60px stat numbers are 2-3x larger than conventional admin panels. The typography IS the layout. It demands attention and creates hierarchy through sheer scale.
324
+
325
+ 6. **Electric color accents** -- Lime and hot pink against black/white create maximum visual voltage. These colors are not "professional" in the traditional sense -- they are aggressive, youthful, and impossible to ignore.
326
+
327
+ ---
328
+
329
+ ## NuxtUI 4 Configuration Hint
330
+
331
+ ```typescript
332
+ // In app.config.ts or nuxt.config.ts
333
+ export default defineAppConfig({
334
+ ui: {
335
+ colors: {
336
+ primary: 'lime',
337
+ secondary: 'pink',
338
+ neutral: 'stone'
339
+ }
340
+ }
341
+ })
342
+ ```
343
+
344
+ Note: NuxtUI 4's color system will handle the primary lime and secondary pink mapping. The thick borders, hard shadows, and asymmetric radii will need custom CSS classes or Tailwind utility composition, as they go beyond the default NuxtUI component styling. The button press animation requires custom transition utilities.
345
+
346
+ ### Key Custom CSS Required
347
+
348
+ ```css
349
+ /* Brutalist shadow utilities */
350
+ .shadow-brutal { box-shadow: 6px 6px 0 0 #09090b; }
351
+ .shadow-brutal-sm { box-shadow: 4px 4px 0 0 #09090b; }
352
+ .shadow-brutal-hover { box-shadow: 2px 2px 0 0 #09090b; }
353
+ .shadow-brutal-lime { box-shadow: 4px 4px 0 0 #a3e635; }
354
+ .shadow-brutal-pink { box-shadow: 4px 4px 0 0 #ec4899; }
355
+ .shadow-brutal-lg { box-shadow: 8px 8px 0 0 #09090b; }
356
+
357
+ /* Dark mode inverted shadows */
358
+ .dark .shadow-brutal { box-shadow: 6px 6px 0 0 #d6d3d1; }
359
+ .dark .shadow-brutal-sm { box-shadow: 4px 4px 0 0 #d6d3d1; }
360
+ .dark .shadow-brutal-hover { box-shadow: 2px 2px 0 0 #d6d3d1; }
361
+
362
+ /* Asymmetric card shape */
363
+ .shape-slash { border-radius: 0 24px 0 24px; }
364
+ .shape-tab { border-radius: 16px 16px 0 0; }
365
+ .shape-pill-left { border-radius: 9999px 4px 4px 9999px; }
366
+ .shape-pill-right { border-radius: 4px 9999px 9999px 4px; }
367
+ .shape-notch-tl { border-radius: 24px 0 0 0; }
368
+ .shape-bottom-heavy { border-radius: 0 0 16px 16px; }
369
+
370
+ /* Button press animation */
371
+ .btn-brutal {
372
+ transition: transform 0.1s ease, box-shadow 0.1s ease;
373
+ }
374
+ .btn-brutal:hover {
375
+ transform: translate(2px, 2px);
376
+ }
377
+ .btn-brutal:active {
378
+ transform: translate(4px, 4px);
379
+ box-shadow: 0 0 0 0 #09090b !important;
380
+ }
381
+ ```
@@ -0,0 +1,231 @@
1
+ # Bold & Modern Theme
2
+
3
+ > A high-energy admin panel theme with a confident visual identity. Deep violet primary, warm amber accents, and a distinctive heading font create an interface that feels cutting-edge and alive.
4
+
5
+ ---
6
+
7
+ ## Color Palette
8
+
9
+ ### Primary: Violet (Tailwind `violet`)
10
+
11
+ The heart of the theme. Deep, saturated violet conveys creativity, innovation, and premium quality. Used for the sidebar, primary buttons, active states, and key navigation elements.
12
+
13
+ | Token | Tailwind Class | Hex | Usage |
14
+ |------------------|------------------|-----------|----------------------------------|
15
+ | primary-50 | `violet-50` | #f5f3ff | Subtle tinted backgrounds |
16
+ | primary-100 | `violet-100` | #ede9fe | Hover states on light surfaces |
17
+ | primary-200 | `violet-200` | #ddd6fe | Light borders, dividers |
18
+ | primary-300 | `violet-300` | #c4b5fd | Disabled / muted primary |
19
+ | primary-400 | `violet-400` | #a78bfa | Secondary buttons, tags |
20
+ | **primary-500** | **`violet-500`** | **#8b5cf6** | **Main primary color** |
21
+ | **primary-600** | **`violet-600`** | **#7c3aed** | **Primary hover / sidebar bg** |
22
+ | primary-700 | `violet-700` | #6d28d9 | Active / pressed states |
23
+ | primary-800 | `violet-800` | #5b21b6 | Dark sidebar variant |
24
+ | primary-900 | `violet-900` | #4c1d95 | Deep backgrounds, overlays |
25
+
26
+ ### Secondary / Accent: Amber (Tailwind `amber`)
27
+
28
+ Warm amber creates a striking contrast against violet. Used sparingly for call-to-action highlights, notification badges, status indicators, and interactive emphasis.
29
+
30
+ | Token | Tailwind Class | Hex | Usage |
31
+ |------------------|------------------|-----------|----------------------------------|
32
+ | accent-50 | `amber-50` | #fffbeb | Warning / accent backgrounds |
33
+ | accent-100 | `amber-100` | #fef3c7 | Light badges |
34
+ | accent-200 | `amber-200` | #fde68a | Highlight backgrounds |
35
+ | accent-300 | `amber-300` | #fcd34d | Secondary tag fills |
36
+ | **accent-400** | **`amber-400`** | **#fbbf24** | **Main accent color** |
37
+ | **accent-500** | **`amber-500`** | **#f59e0b** | **CTA buttons, badges** |
38
+ | accent-600 | `amber-600` | #d97706 | Hover on accent elements |
39
+ | accent-700 | `amber-700` | #b45309 | Active / pressed accent |
40
+
41
+ ### Neutral: Slate (Tailwind `slate`)
42
+
43
+ Slate has a subtle blue undertone that harmonizes naturally with violet, preventing the neutral palette from feeling disconnected.
44
+
45
+ | Token | Tailwind Class | Hex | Usage |
46
+ |------------------|------------------|-----------|----------------------------------|
47
+ | neutral-50 | `slate-50` | #f8fafc | Page background (light mode) |
48
+ | neutral-100 | `slate-100` | #f1f5f9 | Card backgrounds |
49
+ | neutral-200 | `slate-200` | #e2e8f0 | Borders, dividers |
50
+ | neutral-300 | `slate-300` | #cbd5e1 | Disabled text, placeholders |
51
+ | neutral-400 | `slate-400` | #94a3b8 | Muted / secondary text |
52
+ | neutral-500 | `slate-500` | #64748b | Body text (secondary) |
53
+ | neutral-700 | `slate-700` | #334155 | Body text (primary) |
54
+ | neutral-800 | `slate-800` | #1e293b | Headings on light bg |
55
+ | neutral-900 | `slate-900` | #0f172a | High-contrast text |
56
+ | neutral-950 | `slate-950` | #020617 | Dark mode backgrounds |
57
+
58
+ ### Semantic Colors
59
+
60
+ | Purpose | Color | Hex | Notes |
61
+ |-----------|-------------------|-----------|----------------------------------|
62
+ | Success | `emerald-500` | #10b981 | Confirmations, positive states |
63
+ | Warning | `amber-500` | #f59e0b | Shares accent color intentionally|
64
+ | Error | `rose-500` | #f43f5e | Destructive actions, validation |
65
+ | Info | `violet-400` | #a78bfa | Informational, ties to primary |
66
+
67
+ ---
68
+
69
+ ## Typography
70
+
71
+ ### Font Pairing: Space Grotesk + Inter
72
+
73
+ **Heading Font: Space Grotesk** (Google Fonts)
74
+ - Style: Geometric grotesque with distinctive character - slightly quirky letterforms with personality
75
+ - Weights: 500 (Medium) for subheadings, 700 (Bold) for main headings
76
+ - Use for: Page titles, section headers, sidebar navigation labels, card headers, stat numbers
77
+ - Character: Technical, confident, modern - originated from Space Mono, giving it a subtle techy edge
78
+
79
+ **Body Font: Inter** (Google Fonts)
80
+ - Style: Clean, highly legible sans-serif designed specifically for screens
81
+ - Weights: 400 (Regular) for body, 500 (Medium) for labels/emphasis, 600 (Semi-bold) for strong emphasis
82
+ - Use for: Body text, form labels, table content, descriptions, metadata
83
+ - Character: Neutral, professional, extremely readable at small sizes
84
+
85
+ ### Google Fonts Import
86
+
87
+ ```
88
+ https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Space+Grotesk:wght@500;700&display=swap
89
+ ```
90
+
91
+ ### Type Scale
92
+
93
+ | Element | Font | Weight | Size (rem) | Tracking |
94
+ |--------------------|----------------|--------|------------|--------------|
95
+ | Page title (h1) | Space Grotesk | 700 | 1.875 | -0.025em |
96
+ | Section title (h2) | Space Grotesk | 700 | 1.5 | -0.02em |
97
+ | Card header (h3) | Space Grotesk | 500 | 1.125 | -0.01em |
98
+ | Stat number | Space Grotesk | 700 | 2.25 | -0.03em |
99
+ | Body text | Inter | 400 | 0.875 | 0 |
100
+ | Label | Inter | 500 | 0.75 | 0.025em |
101
+ | Small / caption | Inter | 400 | 0.75 | 0.01em |
102
+ | Nav item | Space Grotesk | 500 | 0.875 | 0 |
103
+
104
+ ---
105
+
106
+ ## Component Styling Notes
107
+
108
+ ### Sidebar
109
+
110
+ - **Colored sidebar** with a violet-to-indigo gradient: `bg-gradient-to-b from-violet-600 to-violet-900`
111
+ - White text on the sidebar with `text-white/80` for items and `text-white` for active
112
+ - Active nav item: pill-shaped highlight with `bg-white/15` backdrop + left accent border in amber (`border-l-2 border-amber-400`)
113
+ - Sidebar icons: `text-white/60`, active: `text-amber-400`
114
+ - Logo area: white logo mark against the dark violet, with Space Grotesk app title
115
+
116
+ ### Buttons
117
+
118
+ - **Primary**: `bg-violet-600 hover:bg-violet-700 text-white` with `rounded-lg` (8px radius)
119
+ - **Accent/CTA**: `bg-amber-500 hover:bg-amber-600 text-slate-900` - used for high-priority actions like "Create New", "Save"
120
+ - **Ghost**: `text-violet-600 hover:bg-violet-50` with no border
121
+ - **Destructive**: `bg-rose-500 hover:bg-rose-600 text-white`
122
+ - All buttons use Space Grotesk at font-weight 500 for a distinctive feel
123
+ - Add subtle `shadow-sm` on primary and accent buttons for depth
124
+
125
+ ### Cards
126
+
127
+ - `bg-white rounded-xl shadow-sm border border-slate-200`
128
+ - Card headers can use a thin top accent border: `border-t-2 border-violet-500`
129
+ - Stat cards: large Space Grotesk numbers in `text-violet-600`, with a subtle `bg-violet-50` background
130
+ - Hover state: `hover:shadow-md` with smooth transition
131
+
132
+ ### Tables / Data Grids
133
+
134
+ - Header row: `bg-violet-50 text-violet-900` with Space Grotesk font-weight 500
135
+ - Alternating row backgrounds: `even:bg-slate-50`
136
+ - Row hover: `hover:bg-violet-50/50`
137
+ - Action column icons in `text-violet-500`
138
+ - Sort indicators in `text-amber-500`
139
+
140
+ ### Form Inputs
141
+
142
+ - `rounded-lg border-slate-300 focus:border-violet-500 focus:ring-2 focus:ring-violet-500/20`
143
+ - Labels: Inter medium (500) in `text-slate-700`, uppercase tracking for field group labels
144
+ - Select dropdowns and date pickers follow the same violet focus ring pattern
145
+
146
+ ### Badges / Tags
147
+
148
+ - Primary: `bg-violet-100 text-violet-700 rounded-full`
149
+ - Accent: `bg-amber-100 text-amber-800 rounded-full`
150
+ - Neutral: `bg-slate-100 text-slate-600 rounded-full`
151
+ - Use Space Grotesk at font-weight 500 for badge text
152
+
153
+ ### Notifications / Toasts
154
+
155
+ - Success: left border accent `border-l-4 border-emerald-500` on white card
156
+ - Error: left border accent `border-l-4 border-rose-500`
157
+ - Info: left border accent `border-l-4 border-violet-500`
158
+
159
+ ### Gradient Accents
160
+
161
+ Apply subtle gradients in key places for a bold, premium feel:
162
+ - Page header background: `bg-gradient-to-r from-violet-600 to-violet-500` (optional hero area)
163
+ - Loading skeleton shimmer: violet-tinted
164
+ - Progress bars: `bg-gradient-to-r from-violet-500 to-amber-400` for a striking two-tone effect
165
+
166
+ ### Border Radius Strategy
167
+
168
+ Use larger, softer radii throughout for a modern feel:
169
+ - Buttons: `rounded-lg` (8px)
170
+ - Cards: `rounded-xl` (12px)
171
+ - Inputs: `rounded-lg` (8px)
172
+ - Badges: `rounded-full` (pill)
173
+ - Sidebar nav items: `rounded-lg` (8px)
174
+ - Modals/Dialogs: `rounded-2xl` (16px)
175
+
176
+ ---
177
+
178
+ ## Dark Mode Adjustments
179
+
180
+ | Element | Light Mode | Dark Mode |
181
+ |------------------|-------------------------------|---------------------------------|
182
+ | Page background | `slate-50` | `slate-950` |
183
+ | Card background | `white` | `slate-900` |
184
+ | Card border | `slate-200` | `slate-800` |
185
+ | Sidebar | `violet-600 to violet-900` | `slate-900` with violet accents |
186
+ | Primary text | `slate-700` | `slate-200` |
187
+ | Heading text | `slate-800` | `white` |
188
+ | Primary button | `violet-600` | `violet-500` |
189
+ | Accent button | `amber-500` | `amber-400` |
190
+ | Table header | `violet-50` | `violet-950/50` |
191
+
192
+ ---
193
+
194
+ ## Mood & Inspiration
195
+
196
+ ### Visual Identity Keywords
197
+ Confident, energetic, innovative, premium, tech-forward, striking
198
+
199
+ ### Inspiration References
200
+ - **Pollux UI** - Purple-primary admin dashboard conveying creativity and innovation while maintaining professionalism
201
+ - **Modern fintech dashboards** - Deep dark backgrounds with vivid violet accents, smooth gradients, bold typography, and clear modular structure
202
+ - **Stripe Dashboard** - Clean card-based layout with confident use of a signature color throughout the interface
203
+ - **Linear** - Bold use of purple/violet as a primary color in a professional tool, proving saturated colors work in productivity software
204
+ - **Vercel Dashboard** - Strong typographic hierarchy with a distinctive sans-serif, minimal decoration, letting color and type do the work
205
+
206
+ ### What Makes This Theme "Bold"
207
+ 1. **Saturated primary color** - Violet is inherently eye-catching; not a safe blue or gray
208
+ 2. **Colored sidebar** - Instead of neutral gray sidebar, the gradient violet sidebar is a strong design statement
209
+ 3. **Warm accent contrast** - Amber against violet creates high-energy complementary tension
210
+ 4. **Distinctive heading font** - Space Grotesk has enough personality to be memorable without sacrificing readability
211
+ 5. **Gradient touches** - Subtle gradients in the sidebar, progress bars, and optional hero areas add depth and movement
212
+ 6. **Generous border radius** - Larger radii feel modern and approachable, softening the boldness
213
+
214
+ ---
215
+
216
+ ## NuxtUI 4 Configuration Hint
217
+
218
+ ```typescript
219
+ // In app.config.ts or nuxt.config.ts
220
+ export default defineAppConfig({
221
+ ui: {
222
+ colors: {
223
+ primary: 'violet',
224
+ secondary: 'amber',
225
+ neutral: 'slate'
226
+ }
227
+ }
228
+ })
229
+ ```
230
+
231
+ This maps directly to NuxtUI 4's color system, making all `UButton`, `UBadge`, `UInput`, etc. components automatically use the violet/amber/slate palette.