@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,462 @@
1
+ # Refined Brutalist Theme
2
+
3
+ > The same confrontational architecture -- slash corners, one-sided pill buttons, hard offset shadows -- dressed in a sophisticated, muted wardrobe. Charcoal replaces black, warm sage replaces electric lime, and dusty rose replaces hot pink. The shapes still break rules; the colors whisper instead of shout. Think: a brutalist building clad in hand-finished plaster and aged brass.
4
+
5
+ ---
6
+
7
+ ## Color Palette
8
+
9
+ ### Design Philosophy
10
+
11
+ The original Asymmetric Brutalist theme proved that asymmetric shapes create a compelling visual identity. But the electric lime + hot pink palette competed with the shapes for attention. This refined variant flips the hierarchy: **shapes are the star, colors are the supporting cast.** Every color is desaturated, warm, and considered -- allowing the slash corners and offset shadows to do the visual heavy-lifting.
12
+
13
+ ### Primary: Charcoal + Warm Stone (The Foundation)
14
+
15
+ Instead of maximum black/white contrast, we use deep charcoal and warm stone tones. The slight warmth in both light and dark values creates a lived-in, sophisticated feel -- like aged concrete rather than fresh asphalt.
16
+
17
+ | Token | Tailwind Class | Hex | Usage |
18
+ |------------------|------------------|-----------|-----------------------------------------|
19
+ | base-charcoal | `neutral-800` | #262626 | Borders, shadows, primary text |
20
+ | base-stone | `stone-50` | #fafaf9 | Page background, card fills |
21
+ | warm-cream | `stone-100` | #f5f5f4 | Alternate background, sidebar bg |
22
+ | mid-stone | `stone-200` | #e7e5e4 | Card hover states, table stripes |
23
+ | border-stone | `stone-300` | #d6d3d1 | Secondary borders, dividers |
24
+ | text-muted | `stone-500` | #78716c | Secondary text, placeholders |
25
+
26
+ ### Accent: Sage Green (Tailwind `emerald` desaturated / custom)
27
+
28
+ A muted, earthy sage -- green enough to register as an accent but grey enough to feel restrained. It nods to nature, architecture, and understated luxury. Not neon, not forest -- somewhere between dried herbs and aged copper patina.
29
+
30
+ | Token | Tailwind Class | Hex | Usage |
31
+ |------------------|----------------------|-----------|-----------------------------------------|
32
+ | sage-100 | custom | #e8eeea | Subtle highlight backgrounds |
33
+ | sage-200 | custom | #c5d5cb | Active sidebar item bg, highlight fills |
34
+ | **sage-400** | **custom** | **#7c9a84**| **Primary CTA buttons, active states** |
35
+ | sage-500 | custom | #63806b | Hover on accent elements |
36
+ | sage-600 | custom | #4d6653 | Pressed / active accent |
37
+ | sage-700 | custom | #3a4e3f | Dark mode accent text |
38
+
39
+ ### Secondary Accent: Dusty Rose (Tailwind `rose` desaturated / custom)
40
+
41
+ A muted, powdery rose that handles destructive actions and notifications without the aggression of hot pink. It reads as "attention needed" rather than "alarm." Sophisticated enough for error states without making the entire UI feel urgent.
42
+
43
+ | Token | Tailwind Class | Hex | Usage |
44
+ |------------------|----------------------|-----------|-----------------------------------------|
45
+ | rose-100 | custom | #f2e4e6 | Subtle error/warning backgrounds |
46
+ | rose-300 | custom | #d4a0a8 | Notification badges, warning highlights |
47
+ | **rose-400** | **custom** | **#c4818b**| **Destructive buttons, error states** |
48
+ | rose-500 | custom | #a8636d | Hover on destructive elements |
49
+ | rose-600 | custom | #8c4a54 | Pressed / active destructive |
50
+
51
+ ### Tertiary: Warm Brass / Amber (for info & warmth)
52
+
53
+ A muted amber that replaces sky-blue for info states. Keeps the palette entirely warm-toned and cohesive.
54
+
55
+ | Token | Tailwind Class | Hex | Usage |
56
+ |------------------|----------------------|-----------|-----------------------------------------|
57
+ | brass-200 | custom | #eedcb5 | Info backgrounds |
58
+ | **brass-400** | **custom** | **#c4a265**| **Info badges, warning states** |
59
+ | brass-500 | custom | #a68745 | Hover on info elements |
60
+
61
+ ### Semantic Colors
62
+
63
+ | Purpose | Color | Hex | Notes |
64
+ |-----------|-------------------|-----------|------------------------------------------|
65
+ | Success | sage-400 | #7c9a84 | Ties to primary accent |
66
+ | Warning | brass-400 | #c4a265 | Warm amber, cohesive with palette |
67
+ | Error | rose-400 | #c4818b | Ties to secondary accent |
68
+ | Info | brass-400 | #c4a265 | Warm instead of cool blue |
69
+
70
+ ---
71
+
72
+ ## Typography
73
+
74
+ ### Font Pairing: Space Grotesk (Headings) + DM Sans (Body)
75
+
76
+ The original theme used JetBrains Mono for all body text -- a deliberately transgressive brutalist choice. For the refined variant, we swap to **DM Sans**, a proportional sans-serif with optical sizing that feels polished and highly readable. The contrast between Space Grotesk's geometric quirks in headings and DM Sans's clean body text mirrors the theme's core tension: **brutalist structure, refined surface.**
77
+
78
+ **Heading Font: Space Grotesk** (Google Fonts)
79
+ - Retained from the original -- its geometric irregularities are essential to the brutalist character
80
+ - Weights: **700 (Bold)** for headings, **500 (Medium)** for buttons and nav items
81
+ - The quirky letterforms (asymmetric 'g', squared 'e') echo the asymmetric border-radius shapes
82
+ - Oversized sizing retained -- this is still a brutalist theme
83
+
84
+ **Body Font: DM Sans** (Google Fonts)
85
+ - Style: Proportional sans-serif with optical sizing -- automatically adjusts weight/spacing at different sizes
86
+ - Weights: 400 (Regular) for body, 500 (Medium) for labels and emphasis
87
+ - Character: Clean, modern, highly legible. Designed specifically for web interfaces.
88
+ - The switch from monospace to proportional body text is the single biggest "refinement" signal. Text flows naturally instead of marching in a rigid grid.
89
+
90
+ **Monospace Accent: IBM Plex Mono** (Google Fonts)
91
+ - Used ONLY for code snippets, data cells in tables, and timestamps
92
+ - Weights: 400 (Regular)
93
+ - Adds a structured, systematic quality that pairs well with the brutalist shapes
94
+ - Having monospace as an accent (not default) feels intentional rather than raw
95
+
96
+ ### Google Fonts Import
97
+
98
+ ```
99
+ https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,400;9..40,500&family=IBM+Plex+Mono:wght@400&family=Space+Grotesk:wght@500;700&display=swap
100
+ ```
101
+
102
+ ### Type Scale (OVERSIZED but Proportional)
103
+
104
+ Oversized headings are retained -- they are a brutalist signature. But body text at proportional spacing reads lighter and more sophisticated.
105
+
106
+ | Element | Font | Weight | Size (rem) | Size (px) | Tracking | Notes |
107
+ |-----------------------|-----------------|--------|-------------|-----------|--------------|-------------------------------------|
108
+ | Page title (h1) | Space Grotesk | 700 | **3.0** | **48px** | -0.04em | MASSIVE. Same as original. |
109
+ | Section title (h2) | Space Grotesk | 700 | **2.0** | **32px** | -0.03em | Still commanding. |
110
+ | Card header (h3) | Space Grotesk | 700 | **1.375** | **22px** | -0.02em | Bold, clear hierarchy. |
111
+ | Stat number | Space Grotesk | 700 | **3.75** | **60px** | -0.05em | Enormous KPI numbers. |
112
+ | Body text | DM Sans | 400 | **1.0** | **16px** | 0 | Proportional, clean flow. |
113
+ | Label | DM Sans | 500 | **0.8125** | **13px** | 0.06em | UPPERCASE, letterspaced. |
114
+ | Small / caption | DM Sans | 400 | 0.75 | 12px | 0.02em | Metadata, timestamps. |
115
+ | Table data | IBM Plex Mono | 400 | 0.875 | 14px | 0 | Mono for data alignment. |
116
+ | Code snippet | IBM Plex Mono | 400 | 0.875 | 14px | 0 | Mono where it matters. |
117
+ | Nav item (sidebar) | Space Grotesk | 500 | **1.125** | **18px** | -0.01em | Medium weight -- softer than bold. |
118
+ | Button text | Space Grotesk | 500 | **1.0** | **16px** | 0.02em | UPPERCASE on primary buttons. |
119
+
120
+ ---
121
+
122
+ ## Shape Language
123
+
124
+ ### KEPT FROM ORIGINAL: Asymmetric Corners (The Hero)
125
+
126
+ The shapes are the identity of this theme. Every asymmetric border-radius recipe is retained exactly as-is. The shapes are what the user loved -- do not change them.
127
+
128
+ ### Border Radius Recipes (Unchanged)
129
+
130
+ | Shape Name | CSS `border-radius` | Tailwind (approximate) | Used On |
131
+ |----------------------|----------------------------------------|-----------------------------------------------|-------------------------------|
132
+ | **Slash Card** | `0 24px 0 24px` | `rounded-none rounded-tr-3xl rounded-bl-3xl` | Cards, modals, dialogs |
133
+ | **Tab Shape** | `16px 16px 0 0` | `rounded-t-2xl rounded-b-none` | Tab bars, header sections |
134
+ | **Pill-Left** | `9999px 4px 4px 9999px` | `rounded-l-full rounded-r-sm` | Primary buttons |
135
+ | **Pill-Right** | `4px 9999px 9999px 4px` | `rounded-l-sm rounded-r-full` | Secondary / ghost buttons |
136
+ | **Notch Top-Left** | `24px 0 0 0` | `rounded-tl-3xl` | Sidebar active indicator |
137
+ | **Bottom-Heavy** | `0 0 16px 16px` | `rounded-b-2xl rounded-t-none` | Dropdown menus, popovers |
138
+ | **Sharp** | `0` | `rounded-none` | Inputs, table cells, badges |
139
+
140
+ ### Refined Borders (Slightly Thinner)
141
+
142
+ Borders are reduced from 3px to **2px**. This is the single most impactful refinement at the structural level -- 2px borders still read as intentionally thick and visible, but feel more considered and less aggressive. The skeleton is still visible; it just wears a tailored suit.
143
+
144
+ | Element | Border | CSS |
145
+ |----------------|---------------------------------------------|---------------------------------------|
146
+ | Cards | 2px solid charcoal | `border-2 border-neutral-800` |
147
+ | Buttons | 2px solid charcoal | `border-2 border-neutral-800` |
148
+ | Inputs | 2px solid charcoal | `border-2 border-neutral-800` |
149
+ | Sidebar | Right edge: 2px solid charcoal | `border-r-2 border-neutral-800` |
150
+ | Table | 1px solid stone | `border border-stone-300` |
151
+ | Badges | 2px solid charcoal | `border-2 border-neutral-800` |
152
+
153
+ ### Accent-Colored Shadows (The Key Evolution)
154
+
155
+ The defining change from original: **hard offset shadows use the sage accent color instead of black.** This transforms the shadows from aggressive structural elements into warm, decorative ones. The offset and zero-blur technique remains -- it is still unmistakably neobrutalist -- but the sage-tinted shadow feels like a soft patina rather than a hard stamp.
156
+
157
+ | Element | Shadow CSS | Tailwind Custom | Notes |
158
+ |----------------|---------------------------------------------|-------------------------------------------|-------------------------------|
159
+ | Cards | `box-shadow: 5px 5px 0 0 #7c9a84` | `shadow-[5px_5px_0_0_#7c9a84]` | Sage shadow -- warm depth |
160
+ | Buttons (rest) | `box-shadow: 3px 3px 0 0 #7c9a84` | `shadow-[3px_3px_0_0_#7c9a84]` | Slightly smaller offset |
161
+ | Buttons (hover)| `box-shadow: 1px 1px 0 0 #7c9a84` | `shadow-[1px_1px_0_0_#7c9a84]` | Shrinks on hover (pressed) |
162
+ | Buttons (active)| `box-shadow: 0 0 0 0 transparent` | `shadow-none` | Fully pressed down |
163
+ | Inputs (focus) | `box-shadow: 3px 3px 0 0 #7c9a84` | `shadow-[3px_3px_0_0_#7c9a84]` | Sage shadow on focus |
164
+ | Modals | `box-shadow: 6px 6px 0 0 #7c9a84` | `shadow-[6px_6px_0_0_#7c9a84]` | Maximum depth for overlays |
165
+ | Error inputs | `box-shadow: 3px 3px 0 0 #c4818b` | `shadow-[3px_3px_0_0_#c4818b]` | Rose shadow for errors |
166
+
167
+ ### Button Press Animation (Retained, Refined)
168
+
169
+ Same physical "press" metaphor. Slightly smaller offsets for the refined feel.
170
+
171
+ ```css
172
+ /* Rest state */
173
+ .btn-refined {
174
+ box-shadow: 3px 3px 0 0 #7c9a84;
175
+ transform: translate(0, 0);
176
+ transition: all 0.15s ease;
177
+ }
178
+
179
+ /* Hover */
180
+ .btn-refined:hover {
181
+ box-shadow: 1px 1px 0 0 #7c9a84;
182
+ transform: translate(2px, 2px);
183
+ }
184
+
185
+ /* Active (pressed) */
186
+ .btn-refined:active {
187
+ box-shadow: 0 0 0 0 transparent;
188
+ transform: translate(3px, 3px);
189
+ }
190
+ ```
191
+
192
+ ---
193
+
194
+ ## Component Styling Notes
195
+
196
+ ### Sidebar
197
+
198
+ - **Warm cream background** (`bg-stone-100`) with a refined right border (`border-r-2 border-neutral-800`)
199
+ - Navigation items use Space Grotesk Medium (500) at 18px -- still larger than typical but not as heavy as Bold
200
+ - **Active item**: `bg-sage-200` (#c5d5cb) fill with `rounded-tl-3xl` (only top-left corner rounded) + `border-l-[3px] border-neutral-800` left accent
201
+ - **Hover item**: `bg-stone-200` with the same asymmetric radius
202
+ - Section labels: DM Sans Medium, UPPERCASE, letterspaced, `text-stone-400`, 13px
203
+ - Bottom of sidebar: 2px horizontal rule (`border-t-2 border-neutral-800`) separating user profile area
204
+ - Sidebar width: **280px** (retained -- the larger text still needs room)
205
+
206
+ ### Buttons
207
+
208
+ - **Primary CTA**: `bg-sage-400` (#7c9a84) `text-white border-2 border-neutral-800` with `rounded-l-full rounded-r-sm` (pill-left shape retained). Space Grotesk Medium UPPERCASE. Sage offset shadow.
209
+ - **Secondary**: `bg-stone-50 text-neutral-800 border-2 border-neutral-800` with `rounded-l-sm rounded-r-full` (pill-right mirrors primary). Sage offset shadow.
210
+ - **Destructive**: `bg-rose-400` (#c4818b) `text-white border-2 border-neutral-800` with pill-left shape. Rose offset shadow (`shadow-[3px_3px_0_0_#c4818b]`).
211
+ - **Ghost**: `bg-transparent text-neutral-800 border-2 border-neutral-800` with `rounded-none`. No shadow.
212
+ - All buttons: `px-7 py-2.5` (generous but slightly less than original), min-height 44px
213
+ - Press animation on all buttons with shadows
214
+
215
+ ### Cards
216
+
217
+ - `bg-white border-2 border-neutral-800` with **Slash Card** corners (`rounded-none rounded-tr-3xl rounded-bl-3xl`)
218
+ - Sage offset shadow: `shadow-[5px_5px_0_0_#7c9a84]`
219
+ - Card header: Space Grotesk Bold, 22px, with a 2px bottom border (`border-b-2 border-neutral-800`) separating header from body
220
+ - Card body: generous padding `p-7` (28px)
221
+ - **Stat cards**: Background fill `bg-sage-100` (#e8eeea) with enormous 60px stat numbers in Space Grotesk Bold. Slash Card shape with sage shadow.
222
+ - Hover state: shadow shifts to `shadow-[3px_3px_0_0_#7c9a84]` + `translate(2px, 2px)` -- subtle press effect
223
+ - No gradient. No blur. Hard edges remain. Just softer color.
224
+
225
+ ### Tables / Data Grids
226
+
227
+ - **Grid lines**: Every cell has `border border-stone-300`. Thinner than original but still shows structure.
228
+ - Header row: `bg-neutral-800 text-stone-100` with Space Grotesk Bold. Charcoal instead of pure black.
229
+ - Header text: UPPERCASE, letterspaced (`tracking-wider`)
230
+ - Body cells: IBM Plex Mono Regular, 14px. Monospace for data alignment.
231
+ - Alternating rows: `even:bg-stone-50` -- subtle warmth
232
+ - Row hover: `bg-sage-100` (#e8eeea) highlight
233
+ - Action column: icon buttons with `border border-neutral-800 rounded-none` and hover `bg-sage-200`
234
+ - Sort indicators: `text-rose-400` (#c4818b) arrows
235
+
236
+ ### Form Inputs
237
+
238
+ - **Sharp corners** (`rounded-none`) -- inputs are intentionally angular while cards are asymmetric
239
+ - `border-2 border-neutral-800` charcoal border
240
+ - Focus state: `border-sage-500` (#63806b) + `shadow-[3px_3px_0_0_#7c9a84]` (sage offset shadow appears on focus)
241
+ - Placeholder text: DM Sans Regular, `text-stone-400`
242
+ - Labels: DM Sans Medium, UPPERCASE, `tracking-wider`, positioned above input with `mb-2`
243
+ - Input padding: `px-4 py-2.5` (generous)
244
+ - Input text: DM Sans Regular, 16px
245
+ - Select dropdowns: sharp corners with `border-2`, dropdown panel uses **Bottom-Heavy** radius (`rounded-b-2xl rounded-t-none`)
246
+ - Checkbox / Radio: `w-5 h-5` with `border-2 border-neutral-800`, checked fill `bg-sage-400`
247
+ - Error state: `border-rose-400` + `shadow-[3px_3px_0_0_#c4818b]` (rose offset shadow)
248
+
249
+ ### Badges / Tags
250
+
251
+ - **Completely sharp** (`rounded-none`) -- retained from original
252
+ - `border-2 border-neutral-800 px-3 py-1`
253
+ - Primary: `bg-sage-200` (#c5d5cb) `text-neutral-800`
254
+ - Danger: `bg-rose-400` (#c4818b) `text-white`
255
+ - Neutral: `bg-stone-200 text-neutral-800`
256
+ - Info: `bg-brass-200` (#eedcb5) `text-neutral-800`
257
+ - Font: DM Sans Medium, UPPERCASE, 13px, `tracking-wider`
258
+ - Same stamp-like quality, just muted tones
259
+
260
+ ### Notifications / Toasts
261
+
262
+ - `bg-white border-2 border-neutral-800` with sage offset shadow
263
+ - **Tab Shape** radius (`rounded-t-2xl rounded-b-none`) -- rounded top, flat bottom (retained)
264
+ - Left color bar: `border-l-4` in semantic color (thinner than original 6px)
265
+ - Success: `border-l-4 border-sage-400` (#7c9a84)
266
+ - Error: `border-l-4 border-rose-400` (#c4818b)
267
+ - Warning: `border-l-4 border-brass-400` (#c4a265)
268
+ - Info: `border-l-4 border-brass-400` (#c4a265)
269
+ - Toast text: DM Sans Regular, body size
270
+
271
+ ### Modals / Dialogs
272
+
273
+ - **Slash Card** shape with larger sage shadow: `shadow-[6px_6px_0_0_#7c9a84]`
274
+ - `border-2 border-neutral-800`
275
+ - Overlay: `bg-neutral-800/50` (slightly less opaque than original)
276
+ - Modal header: Space Grotesk Bold 32px with bottom border
277
+ - Close button: `rounded-none border-2 border-neutral-800` square button in top-right
278
+
279
+ ### Pagination
280
+
281
+ - Square buttons (`rounded-none`) with `border border-neutral-800`
282
+ - Active page: `bg-neutral-800 text-stone-100`
283
+ - Hover: `bg-sage-200`
284
+ - DM Sans Medium for page numbers
285
+
286
+ ---
287
+
288
+ ## Dark Mode
289
+
290
+ ### Philosophy: Warm Charcoal, Not Cold Black
291
+
292
+ Dark mode uses warm charcoals and deep stones rather than pure neutral black. The sage accent glows softly against dark backgrounds. Shadows become translucent sage overlays rather than inverting to light colors -- maintaining the same warm, earthy identity.
293
+
294
+ | Element | Light Mode | Dark Mode |
295
+ |----------------------|------------------------------------|-----------------------------------------|
296
+ | Page background | `stone-50` (#fafaf9) | `neutral-900` (#171717) |
297
+ | Card background | `white` | `neutral-800` (#262626) |
298
+ | Card border | `neutral-800` (2px) | `stone-500` (#78716c) (2px) |
299
+ | Hard shadow | `#7c9a84` (sage) | `#3a4e3f` (sage-700) -- darker sage |
300
+ | Sidebar bg | `stone-100` | `neutral-900` |
301
+ | Sidebar border | `neutral-800` right border | `stone-600` (#57534e) right border |
302
+ | Primary text | `neutral-800` | `stone-100` (#f5f5f4) |
303
+ | Body text | `stone-600` (#57534e) | `stone-400` (#a8a29e) |
304
+ | Heading text | `neutral-800` | `stone-100` |
305
+ | Accent (sage) | sage-400 (#7c9a84) | sage-400 (#7c9a84) -- same, glows well |
306
+ | Secondary (rose) | rose-400 (#c4818b) | rose-300 (#d4a0a8) -- slightly lighter |
307
+ | Table header | `neutral-800 bg, stone-100 text` | `neutral-700 bg, stone-200 text` |
308
+ | Input focus shadow | `#7c9a84` (sage) | `#3a4e3f` (dark sage) |
309
+ | Active nav item | `bg-sage-200` (#c5d5cb) | `bg-sage-400/15` (translucent sage) |
310
+ | Stat card bg | `bg-sage-100` (#e8eeea) | `bg-sage-400/10` (translucent sage) |
311
+
312
+ ### Dark Mode Key Principle
313
+
314
+ **Shadows stay warm.** Unlike the original theme which inverted shadows to light colors in dark mode, the refined theme uses a darker shade of the same sage accent. This preserves the warm, earthy mood in both modes. The shadows become subtler in dark mode rather than flipping contrast entirely.
315
+
316
+ ---
317
+
318
+ ## Spacing & Layout Principles
319
+
320
+ | Aspect | Value | Notes |
321
+ |----------------------|------------------------------------|-----------------------------------------|
322
+ | Page padding | `p-8` (32px) | Generous but slightly tighter than orig |
323
+ | Card gap | `gap-6` (24px) | Comfortable spacing between cards |
324
+ | Card inner padding | `p-7` (28px) | Spacious card interiors |
325
+ | Section gap | `mt-10` (40px) | Clear section separation |
326
+ | Sidebar width | 280px | Retained for larger text |
327
+ | Content max-width | 1400px | Wide content area |
328
+ | Grid columns | 12-column grid | Standard layout |
329
+
330
+ ---
331
+
332
+ ## Mood & Inspiration
333
+
334
+ ### Visual Identity Keywords
335
+
336
+ Refined, architectural, warm, tactile, considered, structured, organic-accented, grown-up, understated-bold
337
+
338
+ ### What Changed from Asymmetric Brutalist
339
+
340
+ | Aspect | Original Brutalist | Refined Brutalist |
341
+ |------------------------|----------------------------------|------------------------------------------|
342
+ | **Accent color** | Electric lime (#a3e635) | Sage green (#7c9a84) |
343
+ | **Secondary color** | Hot pink (#ec4899) | Dusty rose (#c4818b) |
344
+ | **Border weight** | 3px black | 2px charcoal |
345
+ | **Shadow color** | Pure black (#09090b) | Sage accent (#7c9a84) |
346
+ | **Body font** | JetBrains Mono (monospace) | DM Sans (proportional) |
347
+ | **Heading weight** | 700 (Bold) only | 700 (Bold) headings, 500 (Medium) nav |
348
+ | **Data/table font** | JetBrains Mono (all text) | IBM Plex Mono (tables/code only) |
349
+ | **Color temperature** | Cool neon on warm base | Warm throughout (sage, stone, brass) |
350
+ | **Overall feel** | Confrontational, aggressive | Confident, sophisticated |
351
+ | **Shapes** | Unchanged | **Unchanged** -- the hero |
352
+
353
+ ### What Stayed the Same
354
+
355
+ 1. **All asymmetric corner shapes** -- slash cards, pill-left/right buttons, notch nav, bottom-heavy dropdowns, sharp inputs
356
+ 2. **Hard offset shadows** -- still zero-blur, still offset, still the neobrutalist signature
357
+ 3. **Oversized typography** -- 48px page titles, 60px stat numbers
358
+ 4. **Button press animation** -- translate + shadow shrink on hover/active
359
+ 5. **Sharp-cornered inputs** -- the angular/asymmetric contrast between forms and cards
360
+ 6. **UPPERCASE labels and button text** -- the structural, stamp-like quality
361
+ 7. **Visible grid structure** -- borders on table cells, thick sidebar dividers
362
+
363
+ ### Inspiration References
364
+
365
+ - **Aesop (the skincare brand)** -- Muted earth tones, warm neutrals, sophisticated typography. Proves that restraint and warmth can feel luxurious. Their website uses dark backgrounds with sage/olive accents in a way that feels timeless.
366
+
367
+ - **Dieter Rams / Braun** -- "Less, but better." The refined brutalist theme channels Rams's principle that good design is as little design as possible. The shapes do the work; the colors step back.
368
+
369
+ - **Japanese Wabi-Sabi aesthetic** -- Finding beauty in imperfection. The asymmetric shapes are the imperfection; the muted palette is the acceptance. The warm stones, sage greens, and dusty roses reference natural materials and patina.
370
+
371
+ - **Architectural concrete + brass** -- Modern architecture that pairs raw concrete forms with warm brass fixtures. The charcoal borders are the concrete; the sage shadows are the brass. The combination of raw structure and warm accent creates sophistication.
372
+
373
+ ---
374
+
375
+ ## NuxtUI 4 Configuration Hint
376
+
377
+ ```typescript
378
+ // In app.config.ts or nuxt.config.ts
379
+ export default defineAppConfig({
380
+ ui: {
381
+ colors: {
382
+ primary: 'emerald', // Closest Tailwind family to sage
383
+ secondary: 'rose', // Dusty rose family
384
+ neutral: 'stone' // Warm neutral base
385
+ }
386
+ }
387
+ })
388
+ ```
389
+
390
+ Note: The exact sage, dusty rose, and brass colors require custom Tailwind color definitions since they don't map perfectly to default Tailwind palettes. The custom palette values should be defined in `tailwind.config.ts` or as CSS custom properties.
391
+
392
+ ### Custom Tailwind Colors Required
393
+
394
+ ```typescript
395
+ // tailwind.config.ts
396
+ export default {
397
+ theme: {
398
+ extend: {
399
+ colors: {
400
+ sage: {
401
+ 100: '#e8eeea',
402
+ 200: '#c5d5cb',
403
+ 400: '#7c9a84',
404
+ 500: '#63806b',
405
+ 600: '#4d6653',
406
+ 700: '#3a4e3f'
407
+ },
408
+ 'dusty-rose': {
409
+ 100: '#f2e4e6',
410
+ 300: '#d4a0a8',
411
+ 400: '#c4818b',
412
+ 500: '#a8636d',
413
+ 600: '#8c4a54'
414
+ },
415
+ brass: {
416
+ 200: '#eedcb5',
417
+ 400: '#c4a265',
418
+ 500: '#a68745'
419
+ }
420
+ }
421
+ }
422
+ }
423
+ }
424
+ ```
425
+
426
+ ### Key Custom CSS Required
427
+
428
+ ```css
429
+ /* Refined Brutalist shadow utilities */
430
+ .shadow-refined { box-shadow: 5px 5px 0 0 #7c9a84; }
431
+ .shadow-refined-sm { box-shadow: 3px 3px 0 0 #7c9a84; }
432
+ .shadow-refined-hover { box-shadow: 1px 1px 0 0 #7c9a84; }
433
+ .shadow-refined-rose { box-shadow: 3px 3px 0 0 #c4818b; }
434
+ .shadow-refined-lg { box-shadow: 6px 6px 0 0 #7c9a84; }
435
+
436
+ /* Dark mode shadows -- darker sage, not inverted */
437
+ .dark .shadow-refined { box-shadow: 5px 5px 0 0 #3a4e3f; }
438
+ .dark .shadow-refined-sm { box-shadow: 3px 3px 0 0 #3a4e3f; }
439
+ .dark .shadow-refined-hover { box-shadow: 1px 1px 0 0 #3a4e3f; }
440
+ .dark .shadow-refined-rose { box-shadow: 3px 3px 0 0 #8c4a54; }
441
+ .dark .shadow-refined-lg { box-shadow: 6px 6px 0 0 #3a4e3f; }
442
+
443
+ /* Asymmetric shape classes (unchanged from original) */
444
+ .shape-slash { border-radius: 0 24px 0 24px; }
445
+ .shape-tab { border-radius: 16px 16px 0 0; }
446
+ .shape-pill-left { border-radius: 9999px 4px 4px 9999px; }
447
+ .shape-pill-right { border-radius: 4px 9999px 9999px 4px; }
448
+ .shape-notch-tl { border-radius: 24px 0 0 0; }
449
+ .shape-bottom-heavy { border-radius: 0 0 16px 16px; }
450
+
451
+ /* Refined button press animation */
452
+ .btn-refined {
453
+ transition: transform 0.15s ease, box-shadow 0.15s ease;
454
+ }
455
+ .btn-refined:hover {
456
+ transform: translate(2px, 2px);
457
+ }
458
+ .btn-refined:active {
459
+ transform: translate(3px, 3px);
460
+ box-shadow: 0 0 0 0 transparent !important;
461
+ }
462
+ ```