@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,232 @@
|
|
|
1
|
+
# Professional & Clean Theme
|
|
2
|
+
|
|
3
|
+
**Inspiration:** Stripe Dashboard, Linear App, Vercel Dashboard
|
|
4
|
+
**Mood:** Trustworthy, focused, calm authority, distraction-free
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Color Palette
|
|
9
|
+
|
|
10
|
+
### Primary: Indigo (Tailwind `indigo`)
|
|
11
|
+
|
|
12
|
+
The primary accent color draws from Stripe's signature blue-violet and Linear's indigo. Indigo conveys professionalism, trust, and calm authority -- ideal for an admin panel where users manage critical data.
|
|
13
|
+
|
|
14
|
+
| Token | Tailwind Class | Hex | Usage |
|
|
15
|
+
|-------------------|------------------|-----------|----------------------------------------|
|
|
16
|
+
| primary-50 | `indigo-50` | `#eef2ff` | Hover backgrounds, subtle highlights |
|
|
17
|
+
| primary-100 | `indigo-100` | `#e0e7ff` | Selected row backgrounds, badges |
|
|
18
|
+
| primary-200 | `indigo-200` | `#c7d2fe` | Focus rings, light borders |
|
|
19
|
+
| primary-300 | `indigo-300` | `#a5b4fc` | Active states, progress indicators |
|
|
20
|
+
| primary-400 | `indigo-400` | `#818cf8` | Hover on primary buttons |
|
|
21
|
+
| **primary-500** | **`indigo-500`** | **`#6366f1`** | **Primary buttons, links, active nav** |
|
|
22
|
+
| primary-600 | `indigo-600` | `#4f46e5` | Primary button pressed state |
|
|
23
|
+
| primary-700 | `indigo-700` | `#4338ca` | Dark mode primary accent |
|
|
24
|
+
| primary-800 | `indigo-800` | `#3730a3` | Dark backgrounds with primary tint |
|
|
25
|
+
| primary-900 | `indigo-900` | `#312e81` | Very dark primary accents |
|
|
26
|
+
| primary-950 | `indigo-950` | `#1e1b4b` | Darkest primary, text on light bg |
|
|
27
|
+
|
|
28
|
+
**Nuxt UI config:** `primary: 'indigo'`
|
|
29
|
+
|
|
30
|
+
### Neutral: Slate (Tailwind `slate`)
|
|
31
|
+
|
|
32
|
+
Slate provides a cool, blue-tinted neutral scale that pairs naturally with indigo. It avoids the warmth of stone/zinc and the sterility of pure gray, landing in a professional sweet spot reminiscent of Stripe's interface.
|
|
33
|
+
|
|
34
|
+
| Token | Tailwind Class | Hex | Usage |
|
|
35
|
+
|-------------------|-----------------|-----------|----------------------------------------|
|
|
36
|
+
| neutral-50 | `slate-50` | `#f8fafc` | Page background (light mode) |
|
|
37
|
+
| neutral-100 | `slate-100` | `#f1f5f9` | Card backgrounds, sidebar bg |
|
|
38
|
+
| neutral-200 | `slate-200` | `#e2e8f0` | Borders, dividers, input borders |
|
|
39
|
+
| neutral-300 | `slate-300` | `#cbd5e1` | Disabled states, placeholder text bg |
|
|
40
|
+
| neutral-400 | `slate-400` | `#94a3b8` | Placeholder text, muted icons |
|
|
41
|
+
| neutral-500 | `slate-500` | `#64748b` | Secondary text, labels |
|
|
42
|
+
| neutral-600 | `slate-600` | `#475569` | Body text (light mode) |
|
|
43
|
+
| neutral-700 | `slate-700` | `#334155` | Heading text (light mode) |
|
|
44
|
+
| neutral-800 | `slate-800` | `#1e293b` | Sidebar dark bg, card bg (dark mode) |
|
|
45
|
+
| neutral-900 | `slate-900` | `#0f172a` | Primary text, page bg (dark mode) |
|
|
46
|
+
| neutral-950 | `slate-950` | `#020617` | Deepest dark mode background |
|
|
47
|
+
|
|
48
|
+
**Nuxt UI config:** `neutral: 'slate'`
|
|
49
|
+
|
|
50
|
+
### Semantic Colors
|
|
51
|
+
|
|
52
|
+
| Purpose | Color Family | Shade | Hex | Usage |
|
|
53
|
+
|------------|-----------------|-------|-----------|---------------------------|
|
|
54
|
+
| Success | `emerald` | 500 | `#10b981` | Success toasts, checkmarks |
|
|
55
|
+
| Warning | `amber` | 500 | `#f59e0b` | Warning alerts, badges |
|
|
56
|
+
| Error | `red` | 500 | `#ef4444` | Error states, destructive |
|
|
57
|
+
| Info | `sky` | 500 | `#0ea5e9` | Info banners, tooltips |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Font Pairing
|
|
62
|
+
|
|
63
|
+
### Heading Font: Manrope
|
|
64
|
+
|
|
65
|
+
- **Type:** Geometric sans-serif, variable weight (200-800)
|
|
66
|
+
- **Why:** Manrope has a distinctive geometric precision with subtly rounded terminals that make headings feel modern and approachable without sacrificing professionalism. Its wider letter-spacing at heavier weights creates confident, authoritative headings.
|
|
67
|
+
- **Weights used:** 600 (semibold for h3-h6), 700 (bold for h1-h2)
|
|
68
|
+
|
|
69
|
+
### Body Font: Inter
|
|
70
|
+
|
|
71
|
+
- **Type:** Humanist sans-serif, variable weight (100-900)
|
|
72
|
+
- **Why:** Inter was designed specifically for computer screens with features like a tall x-height, open apertures, and careful optical adjustments that maximize readability at any size. It is the industry standard for SaaS dashboards and admin UIs -- used by Linear, Vercel, and countless modern applications. It provides low-friction reading in data-heavy interfaces.
|
|
73
|
+
- **Weights used:** 400 (regular body), 500 (medium for labels/table headers), 600 (semibold for emphasis)
|
|
74
|
+
|
|
75
|
+
### Why They Work Together
|
|
76
|
+
|
|
77
|
+
Manrope's geometric structure contrasts nicely with Inter's humanist warmth. Manrope creates visual hierarchy through its distinctive letterforms in headings, while Inter maintains maximum readability in body content, tables, and form fields. Both fonts share similar x-heights and proportions, creating a harmonious rhythm without jarring transitions.
|
|
78
|
+
|
|
79
|
+
### Google Fonts Import
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
https://fonts.googleapis.com/css2?family=Inter:ital,wght@0,100..900;1,100..900&family=Manrope:wght@200..800&display=swap
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### CSS Application
|
|
86
|
+
|
|
87
|
+
```css
|
|
88
|
+
:root {
|
|
89
|
+
--font-heading: 'Manrope', ui-sans-serif, system-ui, sans-serif;
|
|
90
|
+
--font-body: 'Inter', ui-sans-serif, system-ui, sans-serif;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
h1, h2, h3, h4, h5, h6 {
|
|
94
|
+
font-family: var(--font-heading);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
body {
|
|
98
|
+
font-family: var(--font-body);
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Component Styling Notes
|
|
105
|
+
|
|
106
|
+
### Buttons
|
|
107
|
+
|
|
108
|
+
- **Border radius:** `rounded-lg` (8px) -- soft but professional, avoids the playfulness of full rounding
|
|
109
|
+
- **Primary button:** Solid indigo-500 background, white text, indigo-600 on hover
|
|
110
|
+
- **Secondary button:** Slate-100 background, slate-700 text, subtle border
|
|
111
|
+
- **Ghost button:** Transparent background, indigo-600 text, slate-50 hover background
|
|
112
|
+
- **Padding:** `px-4 py-2` for default, `px-3 py-1.5` for small
|
|
113
|
+
- **Font weight:** Medium (500) -- not bold, keeping the clean aesthetic
|
|
114
|
+
- **Transition:** Smooth 150ms color/background transitions
|
|
115
|
+
|
|
116
|
+
### Cards
|
|
117
|
+
|
|
118
|
+
- **Border radius:** `rounded-xl` (12px)
|
|
119
|
+
- **Background:** White (light mode) / slate-800 (dark mode)
|
|
120
|
+
- **Border:** 1px slate-200 (light) / slate-700 (dark) -- subtle, not heavy
|
|
121
|
+
- **Shadow:** `shadow-sm` by default, `shadow-md` on hover for interactive cards
|
|
122
|
+
- **Padding:** `p-6` standard, `p-4` for compact cards
|
|
123
|
+
|
|
124
|
+
### Sidebar
|
|
125
|
+
|
|
126
|
+
- **Background:** White with a right border of slate-200 (light mode) or slate-900 with slate-700 border (dark mode)
|
|
127
|
+
- **Width:** 260px (comfortable for navigation labels)
|
|
128
|
+
- **Active item:** Indigo-50 background with indigo-600 text and a 2px left border in indigo-500
|
|
129
|
+
- **Hover item:** Slate-50 background
|
|
130
|
+
- **Item padding:** `px-3 py-2`
|
|
131
|
+
- **Section labels:** Uppercase, slate-400, text-xs, font-medium, tracking-wide
|
|
132
|
+
- **Icons:** 20px, slate-400 default, indigo-500 when active
|
|
133
|
+
|
|
134
|
+
### Tables / Data Grids
|
|
135
|
+
|
|
136
|
+
- **Header:** Slate-50 background, slate-500 text, text-xs uppercase, font-medium
|
|
137
|
+
- **Row borders:** Slate-100 horizontal dividers only (no vertical lines)
|
|
138
|
+
- **Row hover:** Slate-50 background
|
|
139
|
+
- **Selected row:** Indigo-50 background
|
|
140
|
+
- **Cell padding:** `px-4 py-3`
|
|
141
|
+
- **Stripe effect:** None -- clean white rows with subtle dividers
|
|
142
|
+
|
|
143
|
+
### Forms / Inputs
|
|
144
|
+
|
|
145
|
+
- **Border radius:** `rounded-lg` (8px)
|
|
146
|
+
- **Border:** Slate-300, transitions to indigo-500 on focus
|
|
147
|
+
- **Focus ring:** 2px indigo-200 ring
|
|
148
|
+
- **Label:** Slate-700, text-sm, font-medium, mb-1
|
|
149
|
+
- **Placeholder:** Slate-400
|
|
150
|
+
- **Background:** White (light) / slate-800 (dark)
|
|
151
|
+
- **Error state:** Red-500 border, red-50 background tint, red-600 message text
|
|
152
|
+
|
|
153
|
+
### Spacing Philosophy
|
|
154
|
+
|
|
155
|
+
- **Generous whitespace:** Let content breathe -- err on the side of more space
|
|
156
|
+
- **Consistent rhythm:** Use 4px base unit. Common spacing: 8px, 12px, 16px, 24px, 32px, 48px
|
|
157
|
+
- **Section separation:** 32px between major sections, 16px between related items
|
|
158
|
+
- **Card margins:** 24px gap in grid layouts
|
|
159
|
+
|
|
160
|
+
### Typography Scale
|
|
161
|
+
|
|
162
|
+
| Element | Size | Weight | Font | Color |
|
|
163
|
+
|-------------|------------|---------|----------|-------------|
|
|
164
|
+
| Page title | text-2xl | 700 | Manrope | slate-900 |
|
|
165
|
+
| Section heading | text-lg | 600 | Manrope | slate-800 |
|
|
166
|
+
| Card title | text-base | 600 | Manrope | slate-800 |
|
|
167
|
+
| Body text | text-sm | 400 | Inter | slate-600 |
|
|
168
|
+
| Label | text-sm | 500 | Inter | slate-700 |
|
|
169
|
+
| Caption | text-xs | 400 | Inter | slate-500 |
|
|
170
|
+
| Badge | text-xs | 500 | Inter | varies |
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Mood & Inspiration
|
|
175
|
+
|
|
176
|
+
### 1. Stripe Dashboard
|
|
177
|
+
|
|
178
|
+
Stripe's dashboard epitomizes the professional-clean aesthetic: deep navy-tinted neutrals (`#0A2540`), a bright violet accent (`#635BFF`), and generous whitespace. Their accessible color system ensures every combination passes WCAG AA guidelines. The interface feels premium and trustworthy -- exactly the confidence an admin panel should inspire.
|
|
179
|
+
|
|
180
|
+
### 2. Linear App
|
|
181
|
+
|
|
182
|
+
Linear's interface demonstrates how a near-monochromatic palette with a single strong accent (indigo) creates a focused, productivity-oriented environment. Their use of Inter font, subtle shadows, and minimal borders achieves a clean look that doesn't sacrifice information density. The sidebar navigation with muted icons and clear active states is a direct reference for our admin panel.
|
|
183
|
+
|
|
184
|
+
### 3. Vercel Dashboard
|
|
185
|
+
|
|
186
|
+
Vercel's dashboard shows how slate neutrals and minimal color create an interface that stays out of the way while remaining visually polished. Their approach to data tables (clean dividers, no zebra striping), card layouts (subtle borders, consistent spacing), and navigation (restrained use of active indicators) embodies the "professional & clean" direction.
|
|
187
|
+
|
|
188
|
+
### Overall Feel
|
|
189
|
+
|
|
190
|
+
- **Clean, not sterile** -- Warmth from the blue-tinted slate neutrals
|
|
191
|
+
- **Focused, not boring** -- Indigo accent provides energy without distraction
|
|
192
|
+
- **Professional, not corporate** -- Modern typography and generous spacing feel contemporary
|
|
193
|
+
- **Calm, not passive** -- Strategic use of color draws attention to what matters
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Nuxt UI 4.x Configuration Summary
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
// nuxt.config.ts
|
|
201
|
+
export default defineNuxtConfig({
|
|
202
|
+
ui: {
|
|
203
|
+
colors: {
|
|
204
|
+
primary: 'indigo',
|
|
205
|
+
neutral: 'slate'
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
})
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Key Nuxt UI Component Overrides
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
// app.config.ts
|
|
215
|
+
export default defineAppConfig({
|
|
216
|
+
ui: {
|
|
217
|
+
button: {
|
|
218
|
+
rounded: 'rounded-lg',
|
|
219
|
+
default: {
|
|
220
|
+
size: 'md'
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
card: {
|
|
224
|
+
rounded: 'rounded-xl',
|
|
225
|
+
shadow: 'shadow-sm'
|
|
226
|
+
},
|
|
227
|
+
input: {
|
|
228
|
+
rounded: 'rounded-lg'
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
})
|
|
232
|
+
```
|