@elsapiens/cli 0.1.0 → 0.1.2
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 +115 -54
- package/dist/index.js +109 -36
- package/dist/index.js.map +1 -1
- package/dist/templates/app/app.ejs +295 -13
- package/dist/templates/app/env-example.ejs +3 -0
- package/dist/templates/app/eslint-config.ejs +47 -0
- package/dist/templates/app/help-topics.ejs +135 -0
- package/dist/templates/app/husky-pre-commit.ejs +8 -0
- package/dist/templates/app/index-css.ejs +536 -1
- package/dist/templates/app/main.ejs +81 -4
- package/dist/templates/app/package.ejs +28 -3
- package/dist/templates/app/page-dashboard.ejs +99 -60
- package/dist/templates/app/page-settings.ejs +268 -91
- package/dist/templates/app/postcss-config.ejs +6 -0
- package/dist/templates/app/services-setup.ejs +158 -0
- package/dist/templates/app/tailwind-config.ejs +105 -0
- package/dist/templates/app/test-setup.ejs +1 -0
- package/dist/templates/app/translations-common-en.ejs +23 -0
- package/dist/templates/app/translations-common-index.ejs +18 -0
- package/dist/templates/app/translations-common.ejs +94 -0
- package/dist/templates/app/translations-settings-en.ejs +49 -0
- package/dist/templates/app/translations-settings-index.ejs +18 -0
- package/dist/templates/app/tsconfig-node.ejs +10 -0
- package/dist/templates/app/vite-env.ejs +13 -0
- package/dist/templates/app/vitest-config.ejs +30 -0
- package/dist/templates/pages/list.ejs +636 -165
- package/dist/templates/pages/settings.ejs +208 -136
- package/package.json +4 -2
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { HelpTopic } from '@elsapiens/services';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Help topics for the application
|
|
5
|
+
* These are displayed in the help panel
|
|
6
|
+
*/
|
|
7
|
+
export const helpTopics: HelpTopic[] = [
|
|
8
|
+
// Getting Started
|
|
9
|
+
{
|
|
10
|
+
id: 'getting-started',
|
|
11
|
+
title: 'Getting Started',
|
|
12
|
+
summary: 'Learn the basics of using <%= pascalName %>.',
|
|
13
|
+
category: 'Getting Started',
|
|
14
|
+
content: `
|
|
15
|
+
<h3>Welcome to <%= pascalName %>!</h3>
|
|
16
|
+
<p>This guide will help you get started with the platform and understand its key features.</p>
|
|
17
|
+
|
|
18
|
+
<h4>Quick Start</h4>
|
|
19
|
+
<ol>
|
|
20
|
+
<li><strong>Dashboard:</strong> Your central hub for monitoring key metrics and recent activity.</li>
|
|
21
|
+
<li><strong>Settings:</strong> Customize your account and preferences.</li>
|
|
22
|
+
</ol>
|
|
23
|
+
|
|
24
|
+
<h4>Need Help?</h4>
|
|
25
|
+
<p>Click the help button (?) in the bottom right corner at any time to access this help center.</p>
|
|
26
|
+
`,
|
|
27
|
+
showInHelpPanel: true,
|
|
28
|
+
showInTooltip: false,
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
// Navigation
|
|
32
|
+
{
|
|
33
|
+
id: 'navigation',
|
|
34
|
+
title: 'Navigation',
|
|
35
|
+
summary: 'Learn how to navigate through the application.',
|
|
36
|
+
category: 'Getting Started',
|
|
37
|
+
content: `
|
|
38
|
+
<h3>Navigating the Application</h3>
|
|
39
|
+
<p>The application uses a sidebar navigation on the left side of the screen.</p>
|
|
40
|
+
|
|
41
|
+
<h4>Main Sections</h4>
|
|
42
|
+
<ul>
|
|
43
|
+
<li><strong>Dashboard:</strong> Overview of your workspace with key metrics.</li>
|
|
44
|
+
<li><strong>Settings:</strong> Account and application settings.</li>
|
|
45
|
+
</ul>
|
|
46
|
+
|
|
47
|
+
<h4>Top Bar</h4>
|
|
48
|
+
<p>The top bar shows your current context and provides quick access to user-related features.</p>
|
|
49
|
+
`,
|
|
50
|
+
showInHelpPanel: true,
|
|
51
|
+
relatedTopicIds: ['getting-started', 'settings'],
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
// Settings
|
|
55
|
+
{
|
|
56
|
+
id: 'settings',
|
|
57
|
+
title: 'Settings',
|
|
58
|
+
summary: 'Configure your application preferences.',
|
|
59
|
+
category: 'Getting Started',
|
|
60
|
+
content: `
|
|
61
|
+
<h3>Application Settings</h3>
|
|
62
|
+
<p>Access settings through the gear icon in the navigation. You can customize:</p>
|
|
63
|
+
|
|
64
|
+
<h4>Profile</h4>
|
|
65
|
+
<p>Update your personal information including name and email.</p>
|
|
66
|
+
|
|
67
|
+
<h4>Notifications</h4>
|
|
68
|
+
<p>Control push notifications and email updates.</p>
|
|
69
|
+
|
|
70
|
+
<h4>Appearance</h4>
|
|
71
|
+
<ul>
|
|
72
|
+
<li><strong>Theme:</strong> Choose between light, dark, or system theme.</li>
|
|
73
|
+
<li><strong>Language:</strong> Select your preferred language.</li>
|
|
74
|
+
<li><strong>Spacing Mode:</strong> Adjust UI density (compact, normal, spacious).</li>
|
|
75
|
+
</ul>
|
|
76
|
+
|
|
77
|
+
<h4>Security</h4>
|
|
78
|
+
<p>Update your password and manage security settings.</p>
|
|
79
|
+
`,
|
|
80
|
+
showInHelpPanel: true,
|
|
81
|
+
relatedTopicIds: ['navigation'],
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
// Theme
|
|
85
|
+
{
|
|
86
|
+
id: 'theme',
|
|
87
|
+
title: 'Theme & Appearance',
|
|
88
|
+
summary: 'Customize the look and feel of the application.',
|
|
89
|
+
category: 'Customization',
|
|
90
|
+
content: `
|
|
91
|
+
<h3>Theme & Appearance</h3>
|
|
92
|
+
<p>Personalize the application to match your preferences.</p>
|
|
93
|
+
|
|
94
|
+
<h4>Dark Mode</h4>
|
|
95
|
+
<p>Toggle dark mode from the Settings page. Dark mode reduces eye strain in low-light conditions.</p>
|
|
96
|
+
|
|
97
|
+
<h4>Spacing Mode</h4>
|
|
98
|
+
<p>Adjust the UI density:</p>
|
|
99
|
+
<ul>
|
|
100
|
+
<li><strong>Compact:</strong> Smaller spacing for more content visibility.</li>
|
|
101
|
+
<li><strong>Normal:</strong> Balanced spacing (default).</li>
|
|
102
|
+
<li><strong>Spacious:</strong> Larger spacing for improved readability.</li>
|
|
103
|
+
</ul>
|
|
104
|
+
`,
|
|
105
|
+
showInHelpPanel: true,
|
|
106
|
+
relatedTopicIds: ['settings'],
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
// Keyboard Shortcuts
|
|
110
|
+
{
|
|
111
|
+
id: 'shortcuts',
|
|
112
|
+
title: 'Keyboard Shortcuts',
|
|
113
|
+
summary: 'Speed up your workflow with keyboard shortcuts.',
|
|
114
|
+
category: 'Customization',
|
|
115
|
+
content: `
|
|
116
|
+
<h3>Keyboard Shortcuts</h3>
|
|
117
|
+
<p>Use keyboard shortcuts to navigate and perform actions quickly.</p>
|
|
118
|
+
|
|
119
|
+
<h4>Global Shortcuts</h4>
|
|
120
|
+
<ul>
|
|
121
|
+
<li><kbd>?</kbd> - Open keyboard shortcuts panel</li>
|
|
122
|
+
<li><kbd>Ctrl/Cmd + K</kbd> - Open command palette</li>
|
|
123
|
+
<li><kbd>Esc</kbd> - Close modals and panels</li>
|
|
124
|
+
</ul>
|
|
125
|
+
|
|
126
|
+
<h4>Navigation</h4>
|
|
127
|
+
<ul>
|
|
128
|
+
<li><kbd>G then D</kbd> - Go to Dashboard</li>
|
|
129
|
+
<li><kbd>G then S</kbd> - Go to Settings</li>
|
|
130
|
+
</ul>
|
|
131
|
+
`,
|
|
132
|
+
showInHelpPanel: true,
|
|
133
|
+
relatedTopicIds: ['navigation'],
|
|
134
|
+
},
|
|
135
|
+
];
|
|
@@ -1,5 +1,540 @@
|
|
|
1
|
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
|
|
2
|
+
@import '@elsapiens/styles/variables';
|
|
3
|
+
@import '@elsapiens/styles/color-schemes';
|
|
4
|
+
@import '@elsapiens/styles/backgrounds';
|
|
5
|
+
@import '@elsapiens/styles/components';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* <%= projectName %> - Main Stylesheet
|
|
9
|
+
* Primary Brand Color: Wisteria Blue
|
|
10
|
+
*/
|
|
11
|
+
|
|
1
12
|
@tailwind base;
|
|
2
13
|
@tailwind components;
|
|
3
14
|
@tailwind utilities;
|
|
4
15
|
|
|
5
|
-
|
|
16
|
+
@layer base {
|
|
17
|
+
:root {
|
|
18
|
+
/* =========================================================================
|
|
19
|
+
* Semantic Colors - Light Mode (using --wisteria-* from color-schemes.css)
|
|
20
|
+
* ========================================================================= */
|
|
21
|
+
--background: 220 30% 98%;
|
|
22
|
+
--foreground: var(--wisteria-900);
|
|
23
|
+
--foreground-secondary: var(--wisteria-500);
|
|
24
|
+
|
|
25
|
+
--card: 0 0% 100%;
|
|
26
|
+
--card-foreground: var(--wisteria-900);
|
|
27
|
+
|
|
28
|
+
--popover: 0 0% 100%;
|
|
29
|
+
--popover-foreground: var(--wisteria-900);
|
|
30
|
+
|
|
31
|
+
--primary: var(--wisteria-500);
|
|
32
|
+
--primary-foreground: 0 0% 100%;
|
|
33
|
+
|
|
34
|
+
--secondary: var(--wisteria-100);
|
|
35
|
+
--secondary-foreground: var(--wisteria-800);
|
|
36
|
+
|
|
37
|
+
--muted: var(--wisteria-100);
|
|
38
|
+
--muted-foreground: var(--wisteria-400);
|
|
39
|
+
|
|
40
|
+
--accent: var(--wisteria-100);
|
|
41
|
+
--accent-foreground: var(--wisteria-800);
|
|
42
|
+
|
|
43
|
+
--destructive: 0 84% 60%;
|
|
44
|
+
--destructive-foreground: 0 0% 100%;
|
|
45
|
+
|
|
46
|
+
--border: var(--wisteria-200);
|
|
47
|
+
--input: var(--wisteria-200);
|
|
48
|
+
--ring: var(--wisteria-500);
|
|
49
|
+
|
|
50
|
+
--radius: 0.5rem;
|
|
51
|
+
|
|
52
|
+
/* Status colors */
|
|
53
|
+
--success: 142 71% 45%;
|
|
54
|
+
--warning: 38 92% 50%;
|
|
55
|
+
--error: 0 84% 60%;
|
|
56
|
+
--info: var(--wisteria-500);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.dark {
|
|
60
|
+
--background: var(--wisteria-950);
|
|
61
|
+
--foreground: var(--wisteria-50);
|
|
62
|
+
--foreground-secondary: var(--wisteria-400);
|
|
63
|
+
|
|
64
|
+
--card: var(--wisteria-900);
|
|
65
|
+
--card-foreground: var(--wisteria-50);
|
|
66
|
+
|
|
67
|
+
--popover: var(--wisteria-900);
|
|
68
|
+
--popover-foreground: var(--wisteria-50);
|
|
69
|
+
|
|
70
|
+
--primary: var(--wisteria-400);
|
|
71
|
+
--primary-foreground: var(--wisteria-950);
|
|
72
|
+
|
|
73
|
+
--secondary: var(--wisteria-800);
|
|
74
|
+
--secondary-foreground: var(--wisteria-100);
|
|
75
|
+
|
|
76
|
+
--muted: var(--wisteria-800);
|
|
77
|
+
--muted-foreground: var(--wisteria-400);
|
|
78
|
+
|
|
79
|
+
--accent: var(--wisteria-800);
|
|
80
|
+
--accent-foreground: var(--wisteria-100);
|
|
81
|
+
|
|
82
|
+
--destructive: 0 62% 50%;
|
|
83
|
+
--destructive-foreground: 0 0% 100%;
|
|
84
|
+
|
|
85
|
+
--border: var(--wisteria-700);
|
|
86
|
+
--input: var(--wisteria-700);
|
|
87
|
+
--ring: var(--wisteria-400);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@layer base {
|
|
92
|
+
* {
|
|
93
|
+
@apply border-border;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
html {
|
|
97
|
+
font-size: 16px;
|
|
98
|
+
-webkit-font-smoothing: antialiased;
|
|
99
|
+
-moz-osx-font-smoothing: grayscale;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
body {
|
|
103
|
+
@apply bg-background text-foreground;
|
|
104
|
+
font-family: 'Inter', system-ui, -apple-system, sans-serif;
|
|
105
|
+
line-height: 1.5;
|
|
106
|
+
height: 100vh;
|
|
107
|
+
overflow: hidden;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
#root {
|
|
111
|
+
height: 100%;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* Focus styles for accessibility */
|
|
115
|
+
:focus-visible {
|
|
116
|
+
@apply outline-none ring-2 ring-ring ring-offset-2 ring-offset-background;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/* Monospace for numbers and code */
|
|
120
|
+
code, kbd, pre, samp, .font-mono {
|
|
121
|
+
font-family: 'JetBrains Mono', ui-monospace, monospace;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
@layer components {
|
|
126
|
+
/* Primary Button */
|
|
127
|
+
.btn-primary {
|
|
128
|
+
@apply bg-wisteria-500 text-white px-3 py-2 rounded-md font-medium
|
|
129
|
+
hover:bg-wisteria-600 active:bg-wisteria-700
|
|
130
|
+
focus-visible:ring-2 focus-visible:ring-wisteria-500 focus-visible:ring-offset-2
|
|
131
|
+
disabled:opacity-50 disabled:cursor-not-allowed
|
|
132
|
+
transition-colors duration-150;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* Secondary Button */
|
|
136
|
+
.btn-secondary {
|
|
137
|
+
@apply bg-wisteria-100 text-wisteria-800 px-3 py-2 rounded-md font-medium
|
|
138
|
+
hover:bg-wisteria-200 active:bg-wisteria-300
|
|
139
|
+
dark:bg-wisteria-800 dark:text-wisteria-100
|
|
140
|
+
dark:hover:bg-wisteria-700 dark:active:bg-wisteria-600
|
|
141
|
+
transition-colors duration-150;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* Ghost Button */
|
|
145
|
+
.btn-ghost {
|
|
146
|
+
@apply text-wisteria-600 px-3 py-2 rounded-md font-medium
|
|
147
|
+
hover:bg-wisteria-100 active:bg-wisteria-200
|
|
148
|
+
dark:text-wisteria-300 dark:hover:bg-wisteria-800
|
|
149
|
+
transition-colors duration-150;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* Card */
|
|
153
|
+
.card {
|
|
154
|
+
@apply bg-white dark:bg-wisteria-900 rounded-lg shadow-sm
|
|
155
|
+
border border-wisteria-200 dark:border-wisteria-700
|
|
156
|
+
overflow-hidden;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/* Form Input */
|
|
160
|
+
.input {
|
|
161
|
+
@apply w-full px-3 py-2 rounded-md border border-wisteria-200
|
|
162
|
+
bg-white dark:bg-wisteria-900
|
|
163
|
+
text-wisteria-900 dark:text-wisteria-50
|
|
164
|
+
placeholder:text-wisteria-300 dark:placeholder:text-wisteria-500
|
|
165
|
+
focus:border-wisteria-500 focus:ring-1 focus:ring-wisteria-500
|
|
166
|
+
disabled:opacity-50 disabled:cursor-not-allowed
|
|
167
|
+
transition-colors duration-150;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* Label */
|
|
171
|
+
.label {
|
|
172
|
+
@apply block text-sm font-medium text-wisteria-800 dark:text-wisteria-200 mb-1;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/* Status Badges */
|
|
176
|
+
.badge {
|
|
177
|
+
@apply inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.badge-draft {
|
|
181
|
+
@apply bg-wisteria-100 text-wisteria-700 dark:bg-wisteria-800 dark:text-wisteria-300;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.badge-success {
|
|
185
|
+
@apply bg-green-100 text-green-700 dark:bg-green-900 dark:text-green-300;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.badge-warning {
|
|
189
|
+
@apply bg-amber-100 text-amber-700 dark:bg-amber-900 dark:text-amber-300;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.badge-error {
|
|
193
|
+
@apply bg-red-100 text-red-700 dark:bg-red-900 dark:text-red-300;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/* Skeleton */
|
|
197
|
+
.skeleton {
|
|
198
|
+
@apply bg-wisteria-200 dark:bg-wisteria-700 rounded animate-pulse;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* Empty State */
|
|
202
|
+
.empty-state {
|
|
203
|
+
@apply flex flex-col items-center justify-center py-12 text-center;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.empty-state-icon {
|
|
207
|
+
@apply w-16 h-16 text-wisteria-300 dark:text-wisteria-600 mb-4;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.empty-state-title {
|
|
211
|
+
@apply text-lg font-medium text-wisteria-700 dark:text-wisteria-300 mb-2;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.empty-state-description {
|
|
215
|
+
@apply text-sm text-wisteria-500 dark:text-wisteria-400 max-w-sm;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* Hide scrollbar but keep functionality */
|
|
220
|
+
@layer utilities {
|
|
221
|
+
.scrollbar-hide {
|
|
222
|
+
-ms-overflow-style: none;
|
|
223
|
+
scrollbar-width: none;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.scrollbar-hide::-webkit-scrollbar {
|
|
227
|
+
display: none;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/* =========================================================================
|
|
232
|
+
* Global Scrollbar Styling
|
|
233
|
+
* Thin scrollbar with theme-matching colors
|
|
234
|
+
* ========================================================================= */
|
|
235
|
+
|
|
236
|
+
/* Firefox */
|
|
237
|
+
* {
|
|
238
|
+
scrollbar-width: thin;
|
|
239
|
+
scrollbar-color: hsl(var(--muted-foreground) / 0.4) transparent;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.dark * {
|
|
243
|
+
scrollbar-color: hsl(var(--muted-foreground) / 0.5) transparent;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/* Chrome, Safari, Edge */
|
|
247
|
+
*::-webkit-scrollbar {
|
|
248
|
+
width: 6px;
|
|
249
|
+
height: 6px;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
*::-webkit-scrollbar-track {
|
|
253
|
+
background: transparent;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
*::-webkit-scrollbar-thumb {
|
|
257
|
+
background-color: hsl(var(--muted-foreground) / 0.3);
|
|
258
|
+
border-radius: 3px;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
*::-webkit-scrollbar-thumb:hover {
|
|
262
|
+
background-color: hsl(var(--muted-foreground) / 0.5);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
.dark *::-webkit-scrollbar-thumb {
|
|
266
|
+
background-color: hsl(var(--muted-foreground) / 0.4);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
.dark *::-webkit-scrollbar-thumb:hover {
|
|
270
|
+
background-color: hsl(var(--muted-foreground) / 0.6);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
*::-webkit-scrollbar-corner {
|
|
274
|
+
background: transparent;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/* Hide native scrollbar - for synced scroll containers (Summary, Table) */
|
|
278
|
+
.hide-native-scrollbar {
|
|
279
|
+
scrollbar-width: none !important;
|
|
280
|
+
-ms-overflow-style: none !important;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
.hide-native-scrollbar::-webkit-scrollbar {
|
|
284
|
+
display: none !important;
|
|
285
|
+
width: 0 !important;
|
|
286
|
+
height: 0 !important;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/* Visible scrollbar for custom scrollbars */
|
|
290
|
+
.scrollbar-visible {
|
|
291
|
+
scrollbar-width: auto;
|
|
292
|
+
scrollbar-color: hsl(var(--border)) hsl(var(--muted) / 0.3);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.scrollbar-visible::-webkit-scrollbar {
|
|
296
|
+
width: 10px;
|
|
297
|
+
height: 10px;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.scrollbar-visible::-webkit-scrollbar-track {
|
|
301
|
+
background: hsl(var(--muted) / 0.3);
|
|
302
|
+
border-radius: 5px;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.scrollbar-visible::-webkit-scrollbar-thumb {
|
|
306
|
+
background-color: hsl(var(--border));
|
|
307
|
+
border-radius: 5px;
|
|
308
|
+
border: 2px solid hsl(var(--muted) / 0.3);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.scrollbar-visible::-webkit-scrollbar-thumb:hover {
|
|
312
|
+
background-color: hsl(var(--muted-foreground));
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/* =========================================================================
|
|
316
|
+
* Adaptive Layout Spacing System
|
|
317
|
+
* Uses CSS variables that respond to data-spacing attribute on html element
|
|
318
|
+
* ========================================================================= */
|
|
319
|
+
|
|
320
|
+
:root {
|
|
321
|
+
/* Default (normal) spacing values */
|
|
322
|
+
--el-layout-gap-xs: 0.25rem; /* 4px */
|
|
323
|
+
--el-layout-gap-sm: 0.5rem; /* 8px */
|
|
324
|
+
--el-layout-gap-md: 0.75rem; /* 12px */
|
|
325
|
+
--el-layout-gap-lg: 1rem; /* 16px */
|
|
326
|
+
--el-layout-gap-xl: 1.5rem; /* 24px */
|
|
327
|
+
--el-layout-gap-2xl: 2rem; /* 32px */
|
|
328
|
+
--el-field-grid-gap: 2.25rem; /* 36px - Between form fields in grid */
|
|
329
|
+
|
|
330
|
+
/* Component internal spacing */
|
|
331
|
+
--el-tabs-padding: 0.25rem; /* 4px - for switch/tabs pill container */
|
|
332
|
+
--el-tabs-gap: 0.25rem; /* 4px - gap between tabs/switches */
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/* Compact spacing mode */
|
|
336
|
+
[data-spacing="compact"] {
|
|
337
|
+
--el-layout-gap-xs: 0.25rem; /* 4px */
|
|
338
|
+
--el-layout-gap-sm: 0.5rem; /* 8px */
|
|
339
|
+
--el-layout-gap-md: 0.75rem; /* 12px */
|
|
340
|
+
--el-layout-gap-lg: 1rem; /* 16px */
|
|
341
|
+
--el-layout-gap-xl: 1.5rem; /* 24px */
|
|
342
|
+
--el-layout-gap-2xl: 2rem; /* 32px */
|
|
343
|
+
--el-field-grid-gap: 1.5rem; /* 24px - Between form fields in grid */
|
|
344
|
+
|
|
345
|
+
/* Component internal spacing - compact */
|
|
346
|
+
--el-tabs-padding: 0.25rem; /* 4px */
|
|
347
|
+
--el-tabs-gap: 0.25rem; /* 4px */
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/* Spacious spacing mode */
|
|
351
|
+
[data-spacing="spacious"] {
|
|
352
|
+
--el-layout-gap-xs: 0.5rem; /* 8px */
|
|
353
|
+
--el-layout-gap-sm: 0.75rem; /* 12px */
|
|
354
|
+
--el-layout-gap-md: 1rem; /* 16px */
|
|
355
|
+
--el-layout-gap-lg: 1.5rem; /* 24px */
|
|
356
|
+
--el-layout-gap-xl: 2rem; /* 32px */
|
|
357
|
+
--el-layout-gap-2xl: 3rem; /* 48px */
|
|
358
|
+
--el-field-grid-gap: 3rem; /* 48px - Between form fields in grid */
|
|
359
|
+
|
|
360
|
+
/* Component internal spacing - spacious */
|
|
361
|
+
--el-tabs-padding: 0.375rem; /* 6px */
|
|
362
|
+
--el-tabs-gap: 0.375rem; /* 6px */
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/* Gap utilities */
|
|
366
|
+
.el-gap-xs { gap: var(--el-layout-gap-xs); }
|
|
367
|
+
.el-gap-sm { gap: var(--el-layout-gap-sm); }
|
|
368
|
+
.el-gap-md { gap: var(--el-layout-gap-md); }
|
|
369
|
+
.el-gap-lg { gap: var(--el-layout-gap-lg); }
|
|
370
|
+
.el-gap-xl { gap: var(--el-layout-gap-xl); }
|
|
371
|
+
.el-gap-2xl { gap: var(--el-layout-gap-2xl); }
|
|
372
|
+
|
|
373
|
+
/* Padding utilities - all sides */
|
|
374
|
+
.el-p-xs { padding: var(--el-layout-gap-xs); }
|
|
375
|
+
.el-p-sm { padding: var(--el-layout-gap-sm); }
|
|
376
|
+
.el-p-md { padding: var(--el-layout-gap-md); }
|
|
377
|
+
.el-p-lg { padding: var(--el-layout-gap-lg); }
|
|
378
|
+
.el-p-xl { padding: var(--el-layout-gap-xl); }
|
|
379
|
+
.el-p-2xl { padding: var(--el-layout-gap-2xl); }
|
|
380
|
+
|
|
381
|
+
/* Padding X (horizontal) */
|
|
382
|
+
.el-px-xs { padding-left: var(--el-layout-gap-xs); padding-right: var(--el-layout-gap-xs); }
|
|
383
|
+
.el-px-sm { padding-left: var(--el-layout-gap-sm); padding-right: var(--el-layout-gap-sm); }
|
|
384
|
+
.el-px-md { padding-left: var(--el-layout-gap-md); padding-right: var(--el-layout-gap-md); }
|
|
385
|
+
.el-px-lg { padding-left: var(--el-layout-gap-lg); padding-right: var(--el-layout-gap-lg); }
|
|
386
|
+
.el-px-xl { padding-left: var(--el-layout-gap-xl); padding-right: var(--el-layout-gap-xl); }
|
|
387
|
+
.el-px-2xl { padding-left: var(--el-layout-gap-2xl); padding-right: var(--el-layout-gap-2xl); }
|
|
388
|
+
|
|
389
|
+
/* Padding Y (vertical) */
|
|
390
|
+
.el-py-xs { padding-top: var(--el-layout-gap-xs); padding-bottom: var(--el-layout-gap-xs); }
|
|
391
|
+
.el-py-sm { padding-top: var(--el-layout-gap-sm); padding-bottom: var(--el-layout-gap-sm); }
|
|
392
|
+
.el-py-md { padding-top: var(--el-layout-gap-md); padding-bottom: var(--el-layout-gap-md); }
|
|
393
|
+
.el-py-lg { padding-top: var(--el-layout-gap-lg); padding-bottom: var(--el-layout-gap-lg); }
|
|
394
|
+
.el-py-xl { padding-top: var(--el-layout-gap-xl); padding-bottom: var(--el-layout-gap-xl); }
|
|
395
|
+
.el-py-2xl { padding-top: var(--el-layout-gap-2xl); padding-bottom: var(--el-layout-gap-2xl); }
|
|
396
|
+
|
|
397
|
+
/* Padding Top */
|
|
398
|
+
.el-pt-xs { padding-top: var(--el-layout-gap-xs); }
|
|
399
|
+
.el-pt-sm { padding-top: var(--el-layout-gap-sm); }
|
|
400
|
+
.el-pt-md { padding-top: var(--el-layout-gap-md); }
|
|
401
|
+
.el-pt-lg { padding-top: var(--el-layout-gap-lg); }
|
|
402
|
+
.el-pt-xl { padding-top: var(--el-layout-gap-xl); }
|
|
403
|
+
.el-pt-2xl { padding-top: var(--el-layout-gap-2xl); }
|
|
404
|
+
|
|
405
|
+
/* Padding Bottom */
|
|
406
|
+
.el-pb-xs { padding-bottom: var(--el-layout-gap-xs); }
|
|
407
|
+
.el-pb-sm { padding-bottom: var(--el-layout-gap-sm); }
|
|
408
|
+
.el-pb-md { padding-bottom: var(--el-layout-gap-md); }
|
|
409
|
+
.el-pb-lg { padding-bottom: var(--el-layout-gap-lg); }
|
|
410
|
+
.el-pb-xl { padding-bottom: var(--el-layout-gap-xl); }
|
|
411
|
+
.el-pb-2xl { padding-bottom: var(--el-layout-gap-2xl); }
|
|
412
|
+
|
|
413
|
+
/* Padding Left */
|
|
414
|
+
.el-pl-xs { padding-left: var(--el-layout-gap-xs); }
|
|
415
|
+
.el-pl-sm { padding-left: var(--el-layout-gap-sm); }
|
|
416
|
+
.el-pl-md { padding-left: var(--el-layout-gap-md); }
|
|
417
|
+
.el-pl-lg { padding-left: var(--el-layout-gap-lg); }
|
|
418
|
+
.el-pl-xl { padding-left: var(--el-layout-gap-xl); }
|
|
419
|
+
.el-pl-2xl { padding-left: var(--el-layout-gap-2xl); }
|
|
420
|
+
|
|
421
|
+
/* Padding Right */
|
|
422
|
+
.el-pr-xs { padding-right: var(--el-layout-gap-xs); }
|
|
423
|
+
.el-pr-sm { padding-right: var(--el-layout-gap-sm); }
|
|
424
|
+
.el-pr-md { padding-right: var(--el-layout-gap-md); }
|
|
425
|
+
.el-pr-lg { padding-right: var(--el-layout-gap-lg); }
|
|
426
|
+
.el-pr-xl { padding-right: var(--el-layout-gap-xl); }
|
|
427
|
+
.el-pr-2xl { padding-right: var(--el-layout-gap-2xl); }
|
|
428
|
+
|
|
429
|
+
/* Margin utilities - all sides */
|
|
430
|
+
.el-m-xs { margin: var(--el-layout-gap-xs); }
|
|
431
|
+
.el-m-sm { margin: var(--el-layout-gap-sm); }
|
|
432
|
+
.el-m-md { margin: var(--el-layout-gap-md); }
|
|
433
|
+
.el-m-lg { margin: var(--el-layout-gap-lg); }
|
|
434
|
+
.el-m-xl { margin: var(--el-layout-gap-xl); }
|
|
435
|
+
.el-m-2xl { margin: var(--el-layout-gap-2xl); }
|
|
436
|
+
|
|
437
|
+
/* Margin X (horizontal) */
|
|
438
|
+
.el-mx-xs { margin-left: var(--el-layout-gap-xs); margin-right: var(--el-layout-gap-xs); }
|
|
439
|
+
.el-mx-sm { margin-left: var(--el-layout-gap-sm); margin-right: var(--el-layout-gap-sm); }
|
|
440
|
+
.el-mx-md { margin-left: var(--el-layout-gap-md); margin-right: var(--el-layout-gap-md); }
|
|
441
|
+
.el-mx-lg { margin-left: var(--el-layout-gap-lg); margin-right: var(--el-layout-gap-lg); }
|
|
442
|
+
.el-mx-xl { margin-left: var(--el-layout-gap-xl); margin-right: var(--el-layout-gap-xl); }
|
|
443
|
+
.el-mx-2xl { margin-left: var(--el-layout-gap-2xl); margin-right: var(--el-layout-gap-2xl); }
|
|
444
|
+
|
|
445
|
+
/* Margin Y (vertical) */
|
|
446
|
+
.el-my-xs { margin-top: var(--el-layout-gap-xs); margin-bottom: var(--el-layout-gap-xs); }
|
|
447
|
+
.el-my-sm { margin-top: var(--el-layout-gap-sm); margin-bottom: var(--el-layout-gap-sm); }
|
|
448
|
+
.el-my-md { margin-top: var(--el-layout-gap-md); margin-bottom: var(--el-layout-gap-md); }
|
|
449
|
+
.el-my-lg { margin-top: var(--el-layout-gap-lg); margin-bottom: var(--el-layout-gap-lg); }
|
|
450
|
+
.el-my-xl { margin-top: var(--el-layout-gap-xl); margin-bottom: var(--el-layout-gap-xl); }
|
|
451
|
+
.el-my-2xl { margin-top: var(--el-layout-gap-2xl); margin-bottom: var(--el-layout-gap-2xl); }
|
|
452
|
+
|
|
453
|
+
/* Margin Top */
|
|
454
|
+
.el-mt-xs { margin-top: var(--el-layout-gap-xs); }
|
|
455
|
+
.el-mt-sm { margin-top: var(--el-layout-gap-sm); }
|
|
456
|
+
.el-mt-md { margin-top: var(--el-layout-gap-md); }
|
|
457
|
+
.el-mt-lg { margin-top: var(--el-layout-gap-lg); }
|
|
458
|
+
.el-mt-xl { margin-top: var(--el-layout-gap-xl); }
|
|
459
|
+
.el-mt-2xl { margin-top: var(--el-layout-gap-2xl); }
|
|
460
|
+
|
|
461
|
+
/* Margin Bottom */
|
|
462
|
+
.el-mb-xs { margin-bottom: var(--el-layout-gap-xs); }
|
|
463
|
+
.el-mb-sm { margin-bottom: var(--el-layout-gap-sm); }
|
|
464
|
+
.el-mb-md { margin-bottom: var(--el-layout-gap-md); }
|
|
465
|
+
.el-mb-lg { margin-bottom: var(--el-layout-gap-lg); }
|
|
466
|
+
.el-mb-xl { margin-bottom: var(--el-layout-gap-xl); }
|
|
467
|
+
.el-mb-2xl { margin-bottom: var(--el-layout-gap-2xl); }
|
|
468
|
+
|
|
469
|
+
/* Margin Left */
|
|
470
|
+
.el-ml-xs { margin-left: var(--el-layout-gap-xs); }
|
|
471
|
+
.el-ml-sm { margin-left: var(--el-layout-gap-sm); }
|
|
472
|
+
.el-ml-md { margin-left: var(--el-layout-gap-md); }
|
|
473
|
+
.el-ml-lg { margin-left: var(--el-layout-gap-lg); }
|
|
474
|
+
.el-ml-xl { margin-left: var(--el-layout-gap-xl); }
|
|
475
|
+
.el-ml-2xl { margin-left: var(--el-layout-gap-2xl); }
|
|
476
|
+
|
|
477
|
+
/* Margin Right */
|
|
478
|
+
.el-mr-xs { margin-right: var(--el-layout-gap-xs); }
|
|
479
|
+
.el-mr-sm { margin-right: var(--el-layout-gap-sm); }
|
|
480
|
+
.el-mr-md { margin-right: var(--el-layout-gap-md); }
|
|
481
|
+
.el-mr-lg { margin-right: var(--el-layout-gap-lg); }
|
|
482
|
+
.el-mr-xl { margin-right: var(--el-layout-gap-xl); }
|
|
483
|
+
.el-mr-2xl { margin-right: var(--el-layout-gap-2xl); }
|
|
484
|
+
|
|
485
|
+
/* Space Y (vertical stacking) - margin-top on all but first child */
|
|
486
|
+
.el-space-y-xs > * + * { margin-top: var(--el-layout-gap-xs); }
|
|
487
|
+
.el-space-y-sm > * + * { margin-top: var(--el-layout-gap-sm); }
|
|
488
|
+
.el-space-y-md > * + * { margin-top: var(--el-layout-gap-md); }
|
|
489
|
+
.el-space-y-lg > * + * { margin-top: var(--el-layout-gap-lg); }
|
|
490
|
+
.el-space-y-xl > * + * { margin-top: var(--el-layout-gap-xl); }
|
|
491
|
+
.el-space-y-2xl > * + * { margin-top: var(--el-layout-gap-2xl); }
|
|
492
|
+
|
|
493
|
+
/* Space X (horizontal stacking) - margin-left on all but first child */
|
|
494
|
+
.el-space-x-xs > * + * { margin-left: var(--el-layout-gap-xs); }
|
|
495
|
+
.el-space-x-sm > * + * { margin-left: var(--el-layout-gap-sm); }
|
|
496
|
+
.el-space-x-md > * + * { margin-left: var(--el-layout-gap-md); }
|
|
497
|
+
.el-space-x-lg > * + * { margin-left: var(--el-layout-gap-lg); }
|
|
498
|
+
.el-space-x-xl > * + * { margin-left: var(--el-layout-gap-xl); }
|
|
499
|
+
.el-space-x-2xl > * + * { margin-left: var(--el-layout-gap-2xl); }
|
|
500
|
+
|
|
501
|
+
/* Toast animations */
|
|
502
|
+
@keyframes slide-in {
|
|
503
|
+
from {
|
|
504
|
+
opacity: 0;
|
|
505
|
+
transform: translateX(100%);
|
|
506
|
+
}
|
|
507
|
+
to {
|
|
508
|
+
opacity: 1;
|
|
509
|
+
transform: translateX(0);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
.animate-slide-in {
|
|
514
|
+
animation: slide-in 0.3s ease-out;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/* Modal animations */
|
|
518
|
+
@keyframes fade-in {
|
|
519
|
+
from { opacity: 0; }
|
|
520
|
+
to { opacity: 1; }
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
.animate-fade-in {
|
|
524
|
+
animation: fade-in 0.2s ease-out;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
@keyframes scale-in {
|
|
528
|
+
from {
|
|
529
|
+
opacity: 0;
|
|
530
|
+
transform: scale(0.95);
|
|
531
|
+
}
|
|
532
|
+
to {
|
|
533
|
+
opacity: 1;
|
|
534
|
+
transform: scale(1);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
.animate-scale-in {
|
|
539
|
+
animation: scale-in 0.2s ease-out;
|
|
540
|
+
}
|