@rovela-ai/sdk 0.1.31 → 0.1.33

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 (92) hide show
  1. package/dist/admin/components/AdminGuard.d.ts.map +1 -1
  2. package/dist/admin/components/AdminGuard.js +1 -1
  3. package/dist/admin/components/AdminGuard.js.map +1 -1
  4. package/dist/admin/components/AdminHeader.d.ts.map +1 -1
  5. package/dist/admin/components/AdminHeader.js +1 -15
  6. package/dist/admin/components/AdminHeader.js.map +1 -1
  7. package/dist/admin/components/AdminLayout.js +1 -1
  8. package/dist/admin/components/AdminLayout.js.map +1 -1
  9. package/dist/admin/components/AdminLoginForm.d.ts.map +1 -1
  10. package/dist/admin/components/AdminLoginForm.js +1 -18
  11. package/dist/admin/components/AdminLoginForm.js.map +1 -1
  12. package/dist/admin/components/AdminNav.d.ts +4 -1
  13. package/dist/admin/components/AdminNav.d.ts.map +1 -1
  14. package/dist/admin/components/AdminNav.js +15 -28
  15. package/dist/admin/components/AdminNav.js.map +1 -1
  16. package/dist/admin/components/AdminSetupForm.d.ts.map +1 -1
  17. package/dist/admin/components/AdminSetupForm.js +1 -26
  18. package/dist/admin/components/AdminSetupForm.js.map +1 -1
  19. package/dist/admin/components/CategoryForm.d.ts.map +1 -1
  20. package/dist/admin/components/CategoryForm.js +3 -45
  21. package/dist/admin/components/CategoryForm.js.map +1 -1
  22. package/dist/admin/components/CategorySelect.d.ts.map +1 -1
  23. package/dist/admin/components/CategorySelect.js +4 -20
  24. package/dist/admin/components/CategorySelect.js.map +1 -1
  25. package/dist/admin/components/CustomerDetails.d.ts.map +1 -1
  26. package/dist/admin/components/CustomerDetails.js +16 -15
  27. package/dist/admin/components/CustomerDetails.js.map +1 -1
  28. package/dist/admin/components/CustomerTable.d.ts.map +1 -1
  29. package/dist/admin/components/CustomerTable.js +7 -43
  30. package/dist/admin/components/CustomerTable.js.map +1 -1
  31. package/dist/admin/components/DeleteConfirmDialog.d.ts +1 -2
  32. package/dist/admin/components/DeleteConfirmDialog.d.ts.map +1 -1
  33. package/dist/admin/components/DeleteConfirmDialog.js +1 -21
  34. package/dist/admin/components/DeleteConfirmDialog.js.map +1 -1
  35. package/dist/admin/components/InventoryEditor.d.ts.map +1 -1
  36. package/dist/admin/components/InventoryEditor.js +8 -41
  37. package/dist/admin/components/InventoryEditor.js.map +1 -1
  38. package/dist/admin/components/LowStockAlert.d.ts.map +1 -1
  39. package/dist/admin/components/LowStockAlert.js +5 -21
  40. package/dist/admin/components/LowStockAlert.js.map +1 -1
  41. package/dist/admin/components/OrderDetails.d.ts.map +1 -1
  42. package/dist/admin/components/OrderDetails.js +16 -15
  43. package/dist/admin/components/OrderDetails.js.map +1 -1
  44. package/dist/admin/components/OrderStatusChart.d.ts.map +1 -1
  45. package/dist/admin/components/OrderStatusChart.js +3 -12
  46. package/dist/admin/components/OrderStatusChart.js.map +1 -1
  47. package/dist/admin/components/OrderTable.d.ts.map +1 -1
  48. package/dist/admin/components/OrderTable.js +14 -53
  49. package/dist/admin/components/OrderTable.js.map +1 -1
  50. package/dist/admin/components/ProductForm.d.ts.map +1 -1
  51. package/dist/admin/components/ProductForm.js +4 -96
  52. package/dist/admin/components/ProductForm.js.map +1 -1
  53. package/dist/admin/components/ProductTable.d.ts.map +1 -1
  54. package/dist/admin/components/ProductTable.js +13 -53
  55. package/dist/admin/components/ProductTable.js.map +1 -1
  56. package/dist/admin/components/RecentOrders.d.ts.map +1 -1
  57. package/dist/admin/components/RecentOrders.js +13 -23
  58. package/dist/admin/components/RecentOrders.js.map +1 -1
  59. package/dist/admin/components/RefundDialog.d.ts.map +1 -1
  60. package/dist/admin/components/RefundDialog.js +1 -27
  61. package/dist/admin/components/RefundDialog.js.map +1 -1
  62. package/dist/admin/components/RevenueChart.d.ts.map +1 -1
  63. package/dist/admin/components/RevenueChart.js +4 -12
  64. package/dist/admin/components/RevenueChart.js.map +1 -1
  65. package/dist/admin/components/SEOPreview.d.ts.map +1 -1
  66. package/dist/admin/components/SEOPreview.js +1 -4
  67. package/dist/admin/components/SEOPreview.js.map +1 -1
  68. package/dist/admin/components/StatsCards.d.ts.map +1 -1
  69. package/dist/admin/components/StatsCards.js +2 -16
  70. package/dist/admin/components/StatsCards.js.map +1 -1
  71. package/dist/admin/components/StoreSettings.d.ts.map +1 -1
  72. package/dist/admin/components/StoreSettings.js +2 -1
  73. package/dist/admin/components/StoreSettings.js.map +1 -1
  74. package/dist/admin/components/TagInput.d.ts.map +1 -1
  75. package/dist/admin/components/TagInput.js +2 -9
  76. package/dist/admin/components/TagInput.js.map +1 -1
  77. package/dist/admin/components/VariantManager.d.ts.map +1 -1
  78. package/dist/admin/components/VariantManager.js +3 -54
  79. package/dist/admin/components/VariantManager.js.map +1 -1
  80. package/dist/admin/components/index.d.ts +6 -0
  81. package/dist/admin/components/index.d.ts.map +1 -1
  82. package/dist/admin/components/index.js.map +1 -1
  83. package/dist/admin/hooks/useAdminStats.d.ts +1 -10
  84. package/dist/admin/hooks/useAdminStats.d.ts.map +1 -1
  85. package/dist/admin/hooks/useAdminStats.js.map +1 -1
  86. package/dist/admin/index.d.ts +2 -2
  87. package/dist/admin/index.d.ts.map +1 -1
  88. package/dist/admin/index.js.map +1 -1
  89. package/dist/admin/styles/admin-theme.css +1660 -47
  90. package/dist/admin/types.d.ts +14 -0
  91. package/dist/admin/types.d.ts.map +1 -1
  92. package/package.json +1 -1
@@ -7,6 +7,9 @@
7
7
  * Usage: Wrap admin content with class="rovela-admin-theme"
8
8
  */
9
9
 
10
+ /* Load Plus Jakarta Sans font from Google Fonts */
11
+ @import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700&display=swap');
12
+
10
13
  /* ═══════════════════════════════════════════════════════════════════════════
11
14
  DESIGN TOKENS - CSS Variables
12
15
  ═══════════════════════════════════════════════════════════════════════════ */
@@ -22,9 +25,9 @@
22
25
  --admin-primary-light: 163 86% 95%; /* Very light tint */
23
26
  --admin-primary-foreground: 0 0% 100%; /* White text on primary */
24
27
 
25
- /* Backgrounds */
26
- --admin-background: 36 36% 97%; /* Warm off-white #F7F5F2 */
27
- --admin-background-subtle: 36 30% 94%; /* Slightly darker #F2EEE9 */
28
+ /* Backgrounds - Aligned with Rovela platform */
29
+ --admin-background: 36 36% 95%; /* Warm Cream #F7F3ED - matches platform */
30
+ --admin-background-subtle: 36 20% 90%; /* Slightly darker - matches platform --secondary */
28
31
  --admin-card: 0 0% 100%; /* Pure white cards */
29
32
  --admin-sidebar: 220 20% 14%; /* Dark charcoal #1E2433 */
30
33
  --admin-sidebar-hover: 220 20% 18%; /* Sidebar hover state */
@@ -36,22 +39,22 @@
36
39
  --admin-sidebar-foreground: 220 10% 90%;/* Light text on dark */
37
40
  --admin-sidebar-foreground-muted: 220 10% 60%;
38
41
 
39
- /* Borders */
40
- --admin-border: 220 13% 91%; /* Light gray border #E5E7EB */
41
- --admin-border-hover: 220 13% 85%; /* Darker on hover */
42
+ /* Borders - Warm gray to match Rovela platform */
43
+ --admin-border: 36 20% 90%; /* Warm gray border (was cool gray 220) */
44
+ --admin-border-hover: 36 15% 82%; /* Darker on hover */
42
45
  --admin-border-focus: 163 86% 37%; /* Primary on focus */
43
46
 
44
- /* Status Colors - Semantic */
45
- --admin-success: 142 71% 45%; /* Green #22C55E */
46
- --admin-success-light: 142 76% 95%; /* Light green bg */
47
- --admin-success-dark: 142 71% 35%; /* Dark green text */
48
- --admin-warning: 38 92% 50%; /* Amber #F59E0B */
49
- --admin-warning-light: 38 92% 95%; /* Light amber bg */
50
- --admin-warning-dark: 38 92% 35%; /* Dark amber text */
51
- --admin-error: 0 84% 60%; /* Red #EF4444 */
52
- --admin-error-light: 0 86% 97%; /* Light red bg */
53
- --admin-error-dark: 0 84% 45%; /* Dark red text */
54
- --admin-info: 199 89% 48%; /* Blue #0EA5E9 */
47
+ /* Status Colors - Aligned with Rovela platform semantic colors */
48
+ --admin-success: 168 100% 36%; /* Teal #00B894 - matches platform */
49
+ --admin-success-light: 168 100% 95%; /* Light teal bg */
50
+ --admin-success-dark: 168 100% 26%; /* Dark teal text */
51
+ --admin-warning: 43 97% 71%; /* Warm yellow #FDCB6E - matches platform */
52
+ --admin-warning-light: 43 97% 95%; /* Light yellow bg */
53
+ --admin-warning-dark: 43 97% 40%; /* Dark yellow text */
54
+ --admin-error: 0 100% 71%; /* Soft red #FF6B6B - matches platform */
55
+ --admin-error-light: 0 100% 96%; /* Light red bg */
56
+ --admin-error-dark: 0 100% 50%; /* Dark red text */
57
+ --admin-info: 199 89% 48%; /* Blue #0984E3 - matches platform */
55
58
  --admin-info-light: 199 89% 96%; /* Light blue bg */
56
59
  --admin-info-dark: 199 89% 35%; /* Dark blue text */
57
60
 
@@ -110,14 +113,15 @@
110
113
  --admin-space-16: 4rem; /* 64px */
111
114
 
112
115
  /* ─────────────────────────────────────────────────────────────────────────
113
- BORDERS & RADIUS
116
+ BORDERS & RADIUS - Aligned with Rovela platform scale
114
117
  ───────────────────────────────────────────────────────────────────────── */
115
118
  --admin-radius-none: 0;
116
- --admin-radius-sm: 0.375rem; /* 6px - small elements */
117
- --admin-radius-md: 0.5rem; /* 8px - inputs, buttons */
118
- --admin-radius-lg: 0.75rem; /* 12px - cards */
119
- --admin-radius-xl: 1rem; /* 16px - modals, large cards */
120
- --admin-radius-2xl: 1.25rem; /* 20px - extra large */
119
+ --admin-radius-xs: 0.25rem; /* 4px - XS - tiny elements */
120
+ --admin-radius-sm: 0.5rem; /* 8px - SM - small elements, inputs */
121
+ --admin-radius-md: 0.75rem; /* 12px - MD (default) - buttons, cards */
122
+ --admin-radius-lg: 1rem; /* 16px - LG - large cards, modals */
123
+ --admin-radius-xl: 1.5rem; /* 24px - XL - hero sections */
124
+ --admin-radius-2xl: 2rem; /* 32px - 2XL - extra large */
121
125
  --admin-radius-full: 9999px; /* Pills, avatars */
122
126
 
123
127
  /* Border Widths */
@@ -125,37 +129,51 @@
125
129
  --admin-border-width-2: 2px;
126
130
 
127
131
  /* ─────────────────────────────────────────────────────────────────────────
128
- SHADOWS
132
+ SHADOWS - Aligned with Rovela platform shadow system
129
133
  ───────────────────────────────────────────────────────────────────────── */
134
+ /* Fine-grained elevation scale */
130
135
  --admin-shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.03);
131
- --admin-shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.04), 0 1px 2px -1px rgb(0 0 0 / 0.04);
132
- --admin-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.05), 0 2px 4px -2px rgb(0 0 0 / 0.04);
133
- --admin-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.05), 0 4px 6px -4px rgb(0 0 0 / 0.04);
134
- --admin-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.06), 0 8px 10px -6px rgb(0 0 0 / 0.04);
135
- --admin-shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.15);
136
-
137
- /* Colored Shadows - Primary glow */
136
+ --admin-shadow-sm: 0 2px 4px rgb(0 0 0 / 0.05); /* Platform: shadow-rovela-sm */
137
+ --admin-shadow-md: 0 4px 12px rgb(0 0 0 / 0.08); /* Platform: shadow-rovela-md */
138
+ --admin-shadow-lg: 0 8px 24px rgb(0 0 0 / 0.12); /* Platform: shadow-rovela-lg */
139
+ --admin-shadow-xl: 0 16px 48px rgb(0 0 0 / 0.16); /* Platform: shadow-rovela-xl */
140
+ --admin-shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.20);
141
+
142
+ /* Platform shadow aliases for direct compatibility */
143
+ --shadow-rovela-sm: 0 2px 4px rgba(0, 0, 0, 0.05);
144
+ --shadow-rovela-md: 0 4px 12px rgba(0, 0, 0, 0.08);
145
+ --shadow-rovela-lg: 0 8px 24px rgba(0, 0, 0, 0.12);
146
+ --shadow-rovela-xl: 0 16px 48px rgba(0, 0, 0, 0.16);
147
+
148
+ /* Colored Shadows - Primary emerald glow */
138
149
  --admin-shadow-primary-sm: 0 2px 8px 0 hsl(163 86% 37% / 0.12);
139
150
  --admin-shadow-primary: 0 4px 14px 0 hsl(163 86% 37% / 0.15);
140
151
  --admin-shadow-primary-lg: 0 8px 24px 0 hsl(163 86% 37% / 0.2);
141
152
 
153
+ /* Glow effects - matches platform .glow-accent */
154
+ --admin-glow-accent: 0 0 20px rgba(12, 175, 125, 0.25);
155
+ --admin-glow-accent-lg: 0 0 40px rgba(12, 175, 125, 0.35);
156
+
142
157
  /* Inner shadows */
143
158
  --admin-shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.04);
144
159
 
145
160
  /* ─────────────────────────────────────────────────────────────────────────
146
- TRANSITIONS & ANIMATIONS
161
+ TRANSITIONS & ANIMATIONS - Aligned with Rovela platform timing
147
162
  ───────────────────────────────────────────────────────────────────────── */
148
- --admin-transition-fast: 100ms ease-out;
149
- --admin-transition-base: 150ms ease-out;
150
- --admin-transition-slow: 200ms ease-out;
151
- --admin-transition-slower: 300ms ease-out;
152
-
153
- /* Specific transitions */
154
- --admin-transition-colors: color 150ms ease-out, background-color 150ms ease-out, border-color 150ms ease-out, fill 150ms ease-out, stroke 150ms ease-out;
155
- --admin-transition-opacity: opacity 150ms ease-out;
156
- --admin-transition-shadow: box-shadow 150ms ease-out;
157
- --admin-transition-transform: transform 150ms ease-out;
158
- --admin-transition-all: all 150ms ease-out;
163
+ --admin-transition-fast: 150ms ease-out; /* Platform: duration-fast */
164
+ --admin-transition-base: 250ms ease-out; /* Platform: duration-normal */
165
+ --admin-transition-slow: 400ms ease-out; /* Platform: duration-slow */
166
+ --admin-transition-slower: 500ms ease-out; /* Extended slow */
167
+
168
+ /* Specific transitions - using aligned base timing */
169
+ --admin-transition-colors: color 250ms ease-out, background-color 250ms ease-out, border-color 250ms ease-out, fill 250ms ease-out, stroke 250ms ease-out;
170
+ --admin-transition-opacity: opacity 250ms ease-out;
171
+ --admin-transition-shadow: box-shadow 250ms ease-out;
172
+ --admin-transition-transform: transform 250ms ease-out;
173
+ --admin-transition-all: all 250ms ease-out;
174
+
175
+ /* Rovela Easing - matches platform timing */
176
+ --admin-ease-rovela: cubic-bezier(0.25, 0.1, 0.25, 1);
159
177
 
160
178
  /* ─────────────────────────────────────────────────────────────────────────
161
179
  Z-INDEX SCALE
@@ -194,6 +212,150 @@
194
212
  --destructive-foreground: 0 0% 100%;
195
213
  }
196
214
 
215
+ /* ═══════════════════════════════════════════════════════════════════════════
216
+ DARK MODE SUPPORT - Aligned with Rovela platform .dark class
217
+ ═══════════════════════════════════════════════════════════════════════════ */
218
+
219
+ /* Dark mode via prefers-color-scheme media query */
220
+ @media (prefers-color-scheme: dark) {
221
+ .rovela-admin-theme:not(.light) {
222
+ /* Backgrounds - Dark blue-gray palette */
223
+ --admin-background: 200 10% 10%; /* Dark blue-gray */
224
+ --admin-background-subtle: 200 10% 14%; /* Slightly lighter */
225
+ --admin-card: 200 10% 14%; /* Card surfaces */
226
+ --admin-sidebar: 200 10% 8%; /* Darker sidebar */
227
+ --admin-sidebar-hover: 200 10% 12%; /* Sidebar hover */
228
+
229
+ /* Text Colors - Inverted for dark mode */
230
+ --admin-foreground: 36 36% 95%; /* Cream text */
231
+ --admin-foreground-muted: 196 6% 60%; /* Muted text */
232
+ --admin-foreground-subtle: 196 6% 50%; /* Subtle text */
233
+ --admin-sidebar-foreground: 220 10% 95%; /* Light sidebar text */
234
+ --admin-sidebar-foreground-muted: 220 10% 70%;
235
+
236
+ /* Primary - Brighter emerald for dark mode */
237
+ --admin-primary: 163 86% 45%; /* Brighter emerald */
238
+ --admin-primary-hover: 163 86% 50%; /* Even brighter on hover */
239
+ --admin-primary-light: 163 86% 20%; /* Muted primary for backgrounds */
240
+ --admin-primary-foreground: 200 10% 10%; /* Dark text on primary */
241
+
242
+ /* Borders - Darker warm gray */
243
+ --admin-border: 200 10% 20%; /* Dark border */
244
+ --admin-border-hover: 200 10% 25%; /* Slightly lighter on hover */
245
+ --admin-border-focus: 163 86% 45%; /* Brighter primary on focus */
246
+
247
+ /* Status Colors - Adjusted for dark mode visibility */
248
+ --admin-success: 168 100% 40%; /* Brighter teal */
249
+ --admin-success-light: 168 100% 15%; /* Dark teal bg */
250
+ --admin-success-dark: 168 100% 60%; /* Light teal text */
251
+ --admin-warning: 43 97% 50%; /* Adjusted yellow */
252
+ --admin-warning-light: 43 97% 15%; /* Dark yellow bg */
253
+ --admin-warning-dark: 43 97% 70%; /* Light yellow text */
254
+ --admin-error: 0 100% 65%; /* Brighter red */
255
+ --admin-error-light: 0 100% 15%; /* Dark red bg */
256
+ --admin-error-dark: 0 100% 75%; /* Light red text */
257
+ --admin-info: 199 89% 55%; /* Brighter blue */
258
+ --admin-info-light: 199 89% 15%; /* Dark blue bg */
259
+ --admin-info-dark: 199 89% 70%; /* Light blue text */
260
+
261
+ /* Shadows - More visible in dark mode */
262
+ --admin-shadow-sm: 0 2px 4px rgb(0 0 0 / 0.3);
263
+ --admin-shadow-md: 0 4px 12px rgb(0 0 0 / 0.4);
264
+ --admin-shadow-lg: 0 8px 24px rgb(0 0 0 / 0.5);
265
+ --admin-shadow-xl: 0 16px 48px rgb(0 0 0 / 0.6);
266
+
267
+ /* Standard variable mappings for dark mode */
268
+ --background: var(--admin-background);
269
+ --foreground: var(--admin-foreground);
270
+ --card: var(--admin-card);
271
+ --card-foreground: var(--admin-foreground);
272
+ --popover: var(--admin-card);
273
+ --popover-foreground: var(--admin-foreground);
274
+ --primary: var(--admin-primary);
275
+ --primary-foreground: var(--admin-primary-foreground);
276
+ --secondary: var(--admin-background-subtle);
277
+ --secondary-foreground: var(--admin-foreground);
278
+ --muted: var(--admin-background-subtle);
279
+ --muted-foreground: var(--admin-foreground-muted);
280
+ --accent: var(--admin-primary-light);
281
+ --accent-foreground: var(--admin-primary);
282
+ --border: var(--admin-border);
283
+ --input: var(--admin-border);
284
+ --ring: var(--admin-primary);
285
+ --destructive: var(--admin-error);
286
+ --destructive-foreground: 0 0% 100%;
287
+ }
288
+ }
289
+
290
+ /* Explicit dark mode class (for manual toggle) */
291
+ .rovela-admin-theme.dark {
292
+ /* Backgrounds - Dark blue-gray palette */
293
+ --admin-background: 200 10% 10%;
294
+ --admin-background-subtle: 200 10% 14%;
295
+ --admin-card: 200 10% 14%;
296
+ --admin-sidebar: 200 10% 8%;
297
+ --admin-sidebar-hover: 200 10% 12%;
298
+
299
+ /* Text Colors */
300
+ --admin-foreground: 36 36% 95%;
301
+ --admin-foreground-muted: 196 6% 60%;
302
+ --admin-foreground-subtle: 196 6% 50%;
303
+ --admin-sidebar-foreground: 220 10% 95%;
304
+ --admin-sidebar-foreground-muted: 220 10% 70%;
305
+
306
+ /* Primary */
307
+ --admin-primary: 163 86% 45%;
308
+ --admin-primary-hover: 163 86% 50%;
309
+ --admin-primary-light: 163 86% 20%;
310
+ --admin-primary-foreground: 200 10% 10%;
311
+
312
+ /* Borders */
313
+ --admin-border: 200 10% 20%;
314
+ --admin-border-hover: 200 10% 25%;
315
+ --admin-border-focus: 163 86% 45%;
316
+
317
+ /* Status Colors */
318
+ --admin-success: 168 100% 40%;
319
+ --admin-success-light: 168 100% 15%;
320
+ --admin-success-dark: 168 100% 60%;
321
+ --admin-warning: 43 97% 50%;
322
+ --admin-warning-light: 43 97% 15%;
323
+ --admin-warning-dark: 43 97% 70%;
324
+ --admin-error: 0 100% 65%;
325
+ --admin-error-light: 0 100% 15%;
326
+ --admin-error-dark: 0 100% 75%;
327
+ --admin-info: 199 89% 55%;
328
+ --admin-info-light: 199 89% 15%;
329
+ --admin-info-dark: 199 89% 70%;
330
+
331
+ /* Shadows */
332
+ --admin-shadow-sm: 0 2px 4px rgb(0 0 0 / 0.3);
333
+ --admin-shadow-md: 0 4px 12px rgb(0 0 0 / 0.4);
334
+ --admin-shadow-lg: 0 8px 24px rgb(0 0 0 / 0.5);
335
+ --admin-shadow-xl: 0 16px 48px rgb(0 0 0 / 0.6);
336
+
337
+ /* Standard variable mappings */
338
+ --background: var(--admin-background);
339
+ --foreground: var(--admin-foreground);
340
+ --card: var(--admin-card);
341
+ --card-foreground: var(--admin-foreground);
342
+ --popover: var(--admin-card);
343
+ --popover-foreground: var(--admin-foreground);
344
+ --primary: var(--admin-primary);
345
+ --primary-foreground: var(--admin-primary-foreground);
346
+ --secondary: var(--admin-background-subtle);
347
+ --secondary-foreground: var(--admin-foreground);
348
+ --muted: var(--admin-background-subtle);
349
+ --muted-foreground: var(--admin-foreground-muted);
350
+ --accent: var(--admin-primary-light);
351
+ --accent-foreground: var(--admin-primary);
352
+ --border: var(--admin-border);
353
+ --input: var(--admin-border);
354
+ --ring: var(--admin-primary);
355
+ --destructive: var(--admin-error);
356
+ --destructive-foreground: 0 0% 100%;
357
+ }
358
+
197
359
  /* ═══════════════════════════════════════════════════════════════════════════
198
360
  BASE STYLES
199
361
  ═══════════════════════════════════════════════════════════════════════════ */
@@ -399,6 +561,35 @@
399
561
  pointer-events: none;
400
562
  }
401
563
 
564
+ /* Input Sizes */
565
+ .rovela-admin-theme .admin-input-sm {
566
+ height: 2rem;
567
+ padding: 0 var(--admin-space-2);
568
+ font-size: var(--admin-text-sm);
569
+ border-radius: var(--admin-radius-sm);
570
+ }
571
+
572
+ .rovela-admin-theme .admin-input-lg {
573
+ height: 3rem;
574
+ padding: 0 var(--admin-space-4);
575
+ font-size: var(--admin-text-md);
576
+ }
577
+
578
+ /* Select Sizes */
579
+ .rovela-admin-theme .admin-select-sm {
580
+ height: 2rem;
581
+ padding: 0 var(--admin-space-8) 0 var(--admin-space-2);
582
+ font-size: var(--admin-text-sm);
583
+ border-radius: var(--admin-radius-sm);
584
+ background-size: 1rem;
585
+ }
586
+
587
+ .rovela-admin-theme .admin-select-lg {
588
+ height: 3rem;
589
+ padding: 0 var(--admin-space-10) 0 var(--admin-space-4);
590
+ font-size: var(--admin-text-md);
591
+ }
592
+
402
593
  /* ═══════════════════════════════════════════════════════════════════════════
403
594
  BUTTON COMPONENTS
404
595
  ═══════════════════════════════════════════════════════════════════════════ */
@@ -432,20 +623,23 @@
432
623
  outline-offset: 2px;
433
624
  }
434
625
 
435
- /* Primary Button */
626
+ /* Primary Button - Enhanced with Rovela glow */
436
627
  .rovela-admin-theme .admin-btn-primary {
437
628
  background: hsl(var(--admin-primary));
438
629
  color: hsl(var(--admin-primary-foreground));
630
+ box-shadow: 0 1px 3px 0 hsl(var(--admin-primary) / 0.2);
439
631
  }
440
632
 
441
633
  .rovela-admin-theme .admin-btn-primary:hover:not(:disabled) {
442
634
  background: hsl(var(--admin-primary-hover));
443
- box-shadow: var(--admin-shadow-primary-sm);
635
+ box-shadow: 0 0 20px hsl(var(--admin-primary) / 0.4), 0 4px 12px hsl(var(--admin-primary) / 0.25);
636
+ transform: translateY(-1px);
444
637
  }
445
638
 
446
639
  .rovela-admin-theme .admin-btn-primary:active:not(:disabled) {
447
640
  background: hsl(var(--admin-primary-hover));
448
- box-shadow: var(--admin-shadow-inner);
641
+ box-shadow: 0 0 10px hsl(var(--admin-primary) / 0.3);
642
+ transform: translateY(0);
449
643
  }
450
644
 
451
645
  /* Secondary Button */
@@ -475,14 +669,22 @@
475
669
  background: hsl(var(--admin-background-subtle));
476
670
  }
477
671
 
478
- /* Destructive Button */
672
+ /* Destructive Button - Enhanced with glow */
479
673
  .rovela-admin-theme .admin-btn-destructive {
480
674
  background: hsl(var(--admin-error));
481
675
  color: white;
676
+ box-shadow: 0 1px 3px 0 hsl(var(--admin-error) / 0.2);
482
677
  }
483
678
 
484
679
  .rovela-admin-theme .admin-btn-destructive:hover:not(:disabled) {
485
680
  background: hsl(var(--admin-error-dark));
681
+ box-shadow: 0 0 20px hsl(var(--admin-error) / 0.4), 0 4px 12px hsl(var(--admin-error) / 0.25);
682
+ transform: translateY(-1px);
683
+ }
684
+
685
+ .rovela-admin-theme .admin-btn-destructive:active:not(:disabled) {
686
+ box-shadow: 0 0 10px hsl(var(--admin-error) / 0.3);
687
+ transform: translateY(0);
486
688
  }
487
689
 
488
690
  /* Button Sizes */
@@ -991,6 +1193,23 @@
991
1193
  color: white;
992
1194
  }
993
1195
 
1196
+ /* Native checkbox input (for forms using <input type="checkbox">) */
1197
+ .rovela-admin-theme input.admin-checkbox[type="checkbox"] {
1198
+ width: 1rem;
1199
+ height: 1rem;
1200
+ border-radius: var(--admin-radius-sm);
1201
+ cursor: pointer;
1202
+ accent-color: hsl(var(--admin-primary));
1203
+ }
1204
+
1205
+ /* Native radio input (for forms using <input type="radio">) */
1206
+ .rovela-admin-theme .admin-radio {
1207
+ width: 1rem;
1208
+ height: 1rem;
1209
+ cursor: pointer;
1210
+ accent-color: hsl(var(--admin-primary));
1211
+ }
1212
+
994
1213
  /* ═══════════════════════════════════════════════════════════════════════════
995
1214
  PAGINATION COMPONENT
996
1215
  ═══════════════════════════════════════════════════════════════════════════ */
@@ -1088,6 +1307,193 @@
1088
1307
  }
1089
1308
  }
1090
1309
 
1310
+ /* ═══════════════════════════════════════════════════════════════════════════
1311
+ ENTRANCE ANIMATIONS - Rovela Platform Style
1312
+ ═══════════════════════════════════════════════════════════════════════════ */
1313
+
1314
+ @keyframes admin-fade-in {
1315
+ from {
1316
+ opacity: 0;
1317
+ }
1318
+ to {
1319
+ opacity: 1;
1320
+ }
1321
+ }
1322
+
1323
+ @keyframes admin-fade-up {
1324
+ from {
1325
+ opacity: 0;
1326
+ transform: translateY(16px);
1327
+ }
1328
+ to {
1329
+ opacity: 1;
1330
+ transform: translateY(0);
1331
+ }
1332
+ }
1333
+
1334
+ @keyframes admin-scale-in {
1335
+ from {
1336
+ opacity: 0;
1337
+ transform: scale(0.95);
1338
+ }
1339
+ to {
1340
+ opacity: 1;
1341
+ transform: scale(1);
1342
+ }
1343
+ }
1344
+
1345
+ @keyframes admin-slide-in-right {
1346
+ from {
1347
+ opacity: 0;
1348
+ transform: translateX(16px);
1349
+ }
1350
+ to {
1351
+ opacity: 1;
1352
+ transform: translateX(0);
1353
+ }
1354
+ }
1355
+
1356
+ @keyframes admin-slide-in-left {
1357
+ from {
1358
+ opacity: 0;
1359
+ transform: translateX(-16px);
1360
+ }
1361
+ to {
1362
+ opacity: 1;
1363
+ transform: translateX(0);
1364
+ }
1365
+ }
1366
+
1367
+ /* Animation Utility Classes */
1368
+ .rovela-admin-theme .admin-animate-in {
1369
+ animation: admin-fade-up 0.4s var(--admin-ease-rovela) forwards;
1370
+ }
1371
+
1372
+ .rovela-admin-theme .admin-animate-fade-in {
1373
+ animation: admin-fade-in 0.3s var(--admin-ease-rovela) forwards;
1374
+ }
1375
+
1376
+ .rovela-admin-theme .admin-animate-fade-up {
1377
+ animation: admin-fade-up 0.4s var(--admin-ease-rovela) forwards;
1378
+ }
1379
+
1380
+ .rovela-admin-theme .admin-animate-scale-in {
1381
+ animation: admin-scale-in 0.3s var(--admin-ease-rovela) forwards;
1382
+ }
1383
+
1384
+ .rovela-admin-theme .admin-animate-slide-right {
1385
+ animation: admin-slide-in-right 0.3s var(--admin-ease-rovela) forwards;
1386
+ }
1387
+
1388
+ .rovela-admin-theme .admin-animate-slide-left {
1389
+ animation: admin-slide-in-left 0.3s var(--admin-ease-rovela) forwards;
1390
+ }
1391
+
1392
+ /* Stagger animation delays for lists */
1393
+ .rovela-admin-theme .admin-stagger-1 { animation-delay: 50ms; }
1394
+ .rovela-admin-theme .admin-stagger-2 { animation-delay: 100ms; }
1395
+ .rovela-admin-theme .admin-stagger-3 { animation-delay: 150ms; }
1396
+ .rovela-admin-theme .admin-stagger-4 { animation-delay: 200ms; }
1397
+ .rovela-admin-theme .admin-stagger-5 { animation-delay: 250ms; }
1398
+ .rovela-admin-theme .admin-stagger-6 { animation-delay: 300ms; }
1399
+
1400
+ /* Premium Focus Ring - Rovela Style */
1401
+ .rovela-admin-theme .admin-focus-ring:focus,
1402
+ .rovela-admin-theme .admin-focus-ring:focus-visible {
1403
+ outline: none;
1404
+ box-shadow: 0 0 0 3px hsl(var(--admin-primary) / 0.15), 0 0 0 1px hsl(var(--admin-primary) / 0.3);
1405
+ }
1406
+
1407
+ /* Icon Container - Circular gradient background */
1408
+ .rovela-admin-theme .admin-icon-container {
1409
+ display: flex;
1410
+ align-items: center;
1411
+ justify-content: center;
1412
+ width: 5rem;
1413
+ height: 5rem;
1414
+ border-radius: 50%;
1415
+ background: linear-gradient(135deg, hsl(var(--admin-primary) / 0.2) 0%, hsl(var(--admin-primary) / 0.1) 100%);
1416
+ }
1417
+
1418
+ .rovela-admin-theme .admin-icon-container-sm {
1419
+ width: 2.5rem;
1420
+ height: 2.5rem;
1421
+ }
1422
+
1423
+ .rovela-admin-theme .admin-icon-container-lg {
1424
+ width: 6rem;
1425
+ height: 6rem;
1426
+ }
1427
+
1428
+ /* Chevron hover animation utility */
1429
+ .rovela-admin-theme .admin-chevron-animate {
1430
+ transition: transform 0.2s var(--admin-ease-rovela);
1431
+ }
1432
+
1433
+ .rovela-admin-theme .group:hover .admin-chevron-animate {
1434
+ transform: translateX(4px);
1435
+ }
1436
+
1437
+ /* Card interactive - enhanced hover with lift effect */
1438
+ .rovela-admin-theme .admin-card-interactive {
1439
+ transition: box-shadow 0.2s var(--admin-ease-rovela), transform 0.2s var(--admin-ease-rovela), border-color 0.2s var(--admin-ease-rovela);
1440
+ }
1441
+
1442
+ .rovela-admin-theme .admin-card-interactive:hover {
1443
+ box-shadow: var(--admin-shadow-lg);
1444
+ transform: translateY(-2px);
1445
+ border-color: hsl(var(--admin-border-hover));
1446
+ }
1447
+
1448
+ /* Modal entrance animation */
1449
+ .rovela-admin-theme .admin-modal-animate {
1450
+ animation: admin-scale-in 0.2s var(--admin-ease-rovela) forwards;
1451
+ }
1452
+
1453
+ .rovela-admin-theme .admin-modal-backdrop-animate {
1454
+ animation: admin-fade-in 0.2s var(--admin-ease-rovela) forwards;
1455
+ }
1456
+
1457
+ /* Grid expand/collapse animation (CSS Grid technique) */
1458
+ .rovela-admin-theme .admin-expand-grid {
1459
+ display: grid;
1460
+ transition: grid-template-rows 0.3s var(--admin-ease-rovela), opacity 0.3s var(--admin-ease-rovela);
1461
+ }
1462
+
1463
+ .rovela-admin-theme .admin-expand-grid[data-expanded="true"] {
1464
+ grid-template-rows: 1fr;
1465
+ opacity: 1;
1466
+ }
1467
+
1468
+ .rovela-admin-theme .admin-expand-grid[data-expanded="false"] {
1469
+ grid-template-rows: 0fr;
1470
+ opacity: 0;
1471
+ }
1472
+
1473
+ .rovela-admin-theme .admin-expand-grid > * {
1474
+ overflow: hidden;
1475
+ }
1476
+
1477
+ /* Pulse animation for loading states */
1478
+ @keyframes admin-pulse-soft {
1479
+ 0%, 100% { opacity: 1; }
1480
+ 50% { opacity: 0.6; }
1481
+ }
1482
+
1483
+ .rovela-admin-theme .admin-animate-pulse {
1484
+ animation: admin-pulse-soft 2s ease-in-out infinite;
1485
+ }
1486
+
1487
+ /* Float animation for subtle movement */
1488
+ @keyframes admin-float {
1489
+ 0%, 100% { transform: translateY(0px); }
1490
+ 50% { transform: translateY(-4px); }
1491
+ }
1492
+
1493
+ .rovela-admin-theme .admin-animate-float {
1494
+ animation: admin-float 4s ease-in-out infinite;
1495
+ }
1496
+
1091
1497
  /* ═══════════════════════════════════════════════════════════════════════════
1092
1498
  STAT CARD COMPONENT
1093
1499
  ═══════════════════════════════════════════════════════════════════════════ */
@@ -1162,6 +1568,19 @@
1162
1568
  color: hsl(var(--admin-error));
1163
1569
  }
1164
1570
 
1571
+ .rovela-admin-theme .admin-stat-link {
1572
+ display: flex;
1573
+ align-items: center;
1574
+ font-size: var(--admin-text-xs);
1575
+ font-weight: var(--admin-font-medium);
1576
+ color: hsl(var(--admin-foreground-muted));
1577
+ transition: var(--admin-transition-colors);
1578
+ }
1579
+
1580
+ .rovela-admin-theme .group:hover .admin-stat-link {
1581
+ color: hsl(var(--admin-primary));
1582
+ }
1583
+
1165
1584
  /* ═══════════════════════════════════════════════════════════════════════════
1166
1585
  CHART COLORS (for Recharts)
1167
1586
  ═══════════════════════════════════════════════════════════════════════════ */
@@ -1306,3 +1725,1197 @@
1306
1725
  .rovela-admin-theme .admin-form-group:last-child {
1307
1726
  margin-bottom: 0;
1308
1727
  }
1728
+
1729
+ /* ═══════════════════════════════════════════════════════════════════════════
1730
+ SIDEBAR EXTENDED COMPONENTS
1731
+ ═══════════════════════════════════════════════════════════════════════════ */
1732
+
1733
+ /* Store badge - Initial letter in sidebar header */
1734
+ .rovela-admin-theme .admin-sidebar-badge {
1735
+ display: flex;
1736
+ align-items: center;
1737
+ justify-content: center;
1738
+ width: 2.25rem;
1739
+ height: 2.25rem;
1740
+ border-radius: var(--admin-radius-lg);
1741
+ background: hsl(var(--admin-primary) / 0.15);
1742
+ color: hsl(var(--admin-primary));
1743
+ font-weight: var(--admin-font-semibold);
1744
+ flex-shrink: 0;
1745
+ }
1746
+
1747
+ /* Active indicator bar for nav items */
1748
+ .rovela-admin-theme .admin-sidebar-indicator {
1749
+ position: absolute;
1750
+ left: 0;
1751
+ height: 2rem;
1752
+ width: 0.25rem;
1753
+ border-radius: 0 var(--admin-radius-full) var(--admin-radius-full) 0;
1754
+ background: hsl(var(--admin-primary));
1755
+ opacity: 0;
1756
+ transition: opacity 0.2s var(--admin-ease-rovela);
1757
+ }
1758
+
1759
+ .rovela-admin-theme .admin-sidebar-item.active .admin-sidebar-indicator {
1760
+ opacity: 1;
1761
+ }
1762
+
1763
+ /* View store link button */
1764
+ .rovela-admin-theme .admin-sidebar-link {
1765
+ display: flex;
1766
+ align-items: center;
1767
+ justify-content: center;
1768
+ gap: var(--admin-space-2);
1769
+ padding: var(--admin-space-2) var(--admin-space-3);
1770
+ font-size: var(--admin-text-sm);
1771
+ font-weight: var(--admin-font-medium);
1772
+ color: hsl(var(--admin-sidebar-foreground-muted));
1773
+ background: transparent;
1774
+ border: 1px solid hsl(220 20% 25%);
1775
+ border-radius: var(--admin-radius-lg);
1776
+ text-decoration: none;
1777
+ transition: var(--admin-transition-colors);
1778
+ }
1779
+
1780
+ .rovela-admin-theme .admin-sidebar-link:hover {
1781
+ background: hsl(var(--admin-sidebar-hover));
1782
+ color: hsl(var(--admin-sidebar-foreground));
1783
+ }
1784
+
1785
+ /* Sidebar text utilities */
1786
+ .rovela-admin-theme .admin-text-sidebar {
1787
+ color: hsl(var(--admin-sidebar-foreground));
1788
+ }
1789
+
1790
+ .rovela-admin-theme .admin-text-sidebar-muted {
1791
+ color: hsl(var(--admin-sidebar-foreground-muted));
1792
+ }
1793
+
1794
+ /* ═══════════════════════════════════════════════════════════════════════════
1795
+ HEADER EXTENDED COMPONENTS
1796
+ ═══════════════════════════════════════════════════════════════════════════ */
1797
+
1798
+ /* User menu button in header */
1799
+ .rovela-admin-theme .admin-header-user-btn {
1800
+ display: flex;
1801
+ align-items: center;
1802
+ gap: var(--admin-space-2);
1803
+ padding: var(--admin-space-2) var(--admin-space-3);
1804
+ font-size: var(--admin-text-sm);
1805
+ color: hsl(var(--admin-foreground));
1806
+ background: transparent;
1807
+ border: none;
1808
+ border-radius: var(--admin-radius-lg);
1809
+ cursor: pointer;
1810
+ transition: var(--admin-transition-colors);
1811
+ }
1812
+
1813
+ .rovela-admin-theme .admin-header-user-btn:hover {
1814
+ background: hsl(var(--admin-background-subtle));
1815
+ }
1816
+
1817
+ /* Dropdown header section (user info) */
1818
+ .rovela-admin-theme .admin-dropdown-header {
1819
+ padding: var(--admin-space-3) var(--admin-space-4);
1820
+ border-bottom: 1px solid hsl(var(--admin-border));
1821
+ }
1822
+
1823
+ .rovela-admin-theme .admin-dropdown-header-name {
1824
+ font-size: var(--admin-text-sm);
1825
+ font-weight: var(--admin-font-medium);
1826
+ color: hsl(var(--admin-foreground));
1827
+ }
1828
+
1829
+ .rovela-admin-theme .admin-dropdown-header-email {
1830
+ font-size: var(--admin-text-xs);
1831
+ color: hsl(var(--admin-foreground-muted));
1832
+ }
1833
+
1834
+ /* Dropdown backdrop */
1835
+ .rovela-admin-theme .admin-dropdown-backdrop {
1836
+ position: fixed;
1837
+ inset: 0;
1838
+ z-index: var(--admin-z-dropdown);
1839
+ }
1840
+
1841
+ /* Dropdown animation */
1842
+ .rovela-admin-theme .admin-dropdown-content {
1843
+ animation: admin-scale-in 0.15s var(--admin-ease-rovela) forwards;
1844
+ transform-origin: top right;
1845
+ }
1846
+
1847
+ /* ═══════════════════════════════════════════════════════════════════════════
1848
+ WIDGET CARD UTILITIES
1849
+ ═══════════════════════════════════════════════════════════════════════════ */
1850
+
1851
+ /* Widget card header with border */
1852
+ .rovela-admin-theme .admin-widget-header {
1853
+ display: flex;
1854
+ align-items: center;
1855
+ justify-content: space-between;
1856
+ padding: var(--admin-space-4) var(--admin-space-6);
1857
+ border-bottom: 1px solid hsl(var(--admin-border));
1858
+ }
1859
+
1860
+ /* Primary link styling */
1861
+ .rovela-admin-theme .admin-link-primary {
1862
+ color: hsl(var(--admin-primary));
1863
+ font-weight: var(--admin-font-medium);
1864
+ text-decoration: none;
1865
+ transition: var(--admin-transition-colors);
1866
+ }
1867
+
1868
+ .rovela-admin-theme .admin-link-primary:hover {
1869
+ color: hsl(var(--admin-primary-hover));
1870
+ }
1871
+
1872
+ /* Status icon containers */
1873
+ .rovela-admin-theme .admin-status-icon {
1874
+ display: flex;
1875
+ align-items: center;
1876
+ justify-content: center;
1877
+ padding: var(--admin-space-2);
1878
+ border-radius: var(--admin-radius-full);
1879
+ }
1880
+
1881
+ .rovela-admin-theme .admin-status-icon-success {
1882
+ background: hsl(var(--admin-success) / 0.1);
1883
+ color: hsl(var(--admin-success));
1884
+ }
1885
+
1886
+ .rovela-admin-theme .admin-status-icon-warning {
1887
+ background: hsl(var(--admin-warning) / 0.1);
1888
+ color: hsl(var(--admin-warning));
1889
+ }
1890
+
1891
+ .rovela-admin-theme .admin-status-icon-error {
1892
+ background: hsl(var(--admin-error) / 0.1);
1893
+ color: hsl(var(--admin-error));
1894
+ }
1895
+
1896
+ .rovela-admin-theme .admin-status-icon-info {
1897
+ background: hsl(var(--admin-info) / 0.1);
1898
+ color: hsl(var(--admin-info));
1899
+ }
1900
+
1901
+ /* List item with hover - uses pure CSS */
1902
+ .rovela-admin-theme .admin-list-item {
1903
+ display: flex;
1904
+ align-items: center;
1905
+ padding: var(--admin-space-4) var(--admin-space-6);
1906
+ border-bottom: 1px solid hsl(var(--admin-border));
1907
+ transition: var(--admin-transition-colors);
1908
+ }
1909
+
1910
+ .rovela-admin-theme .admin-list-item:hover {
1911
+ background: hsl(var(--admin-background-subtle));
1912
+ }
1913
+
1914
+ .rovela-admin-theme .admin-list-item:last-child {
1915
+ border-bottom: none;
1916
+ }
1917
+
1918
+ /* List item link - color changes on parent hover */
1919
+ .rovela-admin-theme .admin-list-item-link {
1920
+ color: hsl(var(--admin-foreground));
1921
+ text-decoration: none;
1922
+ font-weight: var(--admin-font-medium);
1923
+ transition: var(--admin-transition-colors);
1924
+ }
1925
+
1926
+ .rovela-admin-theme .admin-list-item:hover .admin-list-item-link {
1927
+ color: hsl(var(--admin-primary));
1928
+ }
1929
+
1930
+ /* ═══════════════════════════════════════════════════════════════════════════
1931
+ ORDER STATUS BADGES
1932
+ ═══════════════════════════════════════════════════════════════════════════ */
1933
+
1934
+ /* Status-specific badge variants for orders */
1935
+ .rovela-admin-theme .admin-badge-pending {
1936
+ background: hsl(var(--admin-warning) / 0.1);
1937
+ color: hsl(var(--admin-warning));
1938
+ }
1939
+
1940
+ .rovela-admin-theme .admin-badge-paid {
1941
+ background: hsl(var(--admin-success) / 0.1);
1942
+ color: hsl(var(--admin-success));
1943
+ }
1944
+
1945
+ .rovela-admin-theme .admin-badge-shipped {
1946
+ background: hsl(var(--admin-info) / 0.1);
1947
+ color: hsl(var(--admin-info));
1948
+ }
1949
+
1950
+ .rovela-admin-theme .admin-badge-delivered {
1951
+ background: hsl(var(--admin-primary) / 0.1);
1952
+ color: hsl(var(--admin-primary));
1953
+ }
1954
+
1955
+ .rovela-admin-theme .admin-badge-cancelled {
1956
+ background: hsl(var(--admin-error) / 0.1);
1957
+ color: hsl(var(--admin-error));
1958
+ }
1959
+
1960
+ .rovela-admin-theme .admin-badge-refunded {
1961
+ background: hsl(var(--admin-background-subtle));
1962
+ color: hsl(var(--admin-foreground-muted));
1963
+ }
1964
+
1965
+ /* Out of stock variant */
1966
+ .rovela-admin-theme .admin-badge-out-of-stock {
1967
+ background: hsl(var(--admin-error) / 0.1);
1968
+ color: hsl(var(--admin-error));
1969
+ }
1970
+
1971
+ .rovela-admin-theme .admin-badge-low-stock {
1972
+ background: hsl(var(--admin-warning) / 0.1);
1973
+ color: hsl(var(--admin-warning));
1974
+ }
1975
+
1976
+ /* ═══════════════════════════════════════════════════════════════════════════
1977
+ TABLE ROW HOVER - Pure CSS
1978
+ ═══════════════════════════════════════════════════════════════════════════ */
1979
+
1980
+ /* Table row with hover effect - use instead of onMouseEnter/Leave */
1981
+ .rovela-admin-theme .admin-table-row {
1982
+ border-bottom: 1px solid hsl(var(--admin-border));
1983
+ transition: var(--admin-transition-colors);
1984
+ }
1985
+
1986
+ .rovela-admin-theme .admin-table-row:hover {
1987
+ background: hsl(var(--admin-background-subtle));
1988
+ }
1989
+
1990
+ .rovela-admin-theme .admin-table-row:last-child {
1991
+ border-bottom: none;
1992
+ }
1993
+
1994
+ /* Link within table row - changes color on row hover */
1995
+ .rovela-admin-theme .admin-table-row-link {
1996
+ color: hsl(var(--admin-primary));
1997
+ font-weight: var(--admin-font-medium);
1998
+ text-decoration: none;
1999
+ transition: var(--admin-transition-colors);
2000
+ }
2001
+
2002
+ /* ═══════════════════════════════════════════════════════════════════════════
2003
+ SKELETON LOADERS
2004
+ ═══════════════════════════════════════════════════════════════════════════ */
2005
+
2006
+ /* Skeleton sizes */
2007
+ .rovela-admin-theme .admin-skeleton-sm {
2008
+ height: 0.75rem;
2009
+ }
2010
+
2011
+ .rovela-admin-theme .admin-skeleton-md {
2012
+ height: 1rem;
2013
+ }
2014
+
2015
+ .rovela-admin-theme .admin-skeleton-lg {
2016
+ height: 1.5rem;
2017
+ }
2018
+
2019
+ .rovela-admin-theme .admin-skeleton-xl {
2020
+ height: 2.25rem;
2021
+ }
2022
+
2023
+ /* ═══════════════════════════════════════════════════════════════════════════
2024
+ EMPTY STATE UTILITIES
2025
+ ═══════════════════════════════════════════════════════════════════════════ */
2026
+
2027
+ .rovela-admin-theme .admin-empty-icon {
2028
+ color: hsl(var(--admin-foreground-muted) / 0.3);
2029
+ }
2030
+
2031
+ .rovela-admin-theme .admin-empty-text {
2032
+ color: hsl(var(--admin-foreground-muted));
2033
+ }
2034
+
2035
+ .rovela-admin-theme .admin-empty-subtext {
2036
+ color: hsl(var(--admin-foreground-muted) / 0.7);
2037
+ }
2038
+
2039
+ /* ═══════════════════════════════════════════════════════════════════════════
2040
+ WIDGET CARD STYLES
2041
+ ═══════════════════════════════════════════════════════════════════════════ */
2042
+
2043
+ /* Widget card header with title and action */
2044
+ .rovela-admin-theme .admin-widget-title {
2045
+ font-size: var(--admin-text-lg);
2046
+ font-weight: var(--admin-font-semibold);
2047
+ color: hsl(var(--admin-foreground));
2048
+ }
2049
+
2050
+ .rovela-admin-theme .admin-widget-subtitle {
2051
+ font-size: var(--admin-text-sm);
2052
+ color: hsl(var(--admin-foreground-muted));
2053
+ }
2054
+
2055
+ /* View all link with chevron */
2056
+ .rovela-admin-theme .admin-view-all-link {
2057
+ display: inline-flex;
2058
+ align-items: center;
2059
+ gap: var(--admin-space-1);
2060
+ font-size: var(--admin-text-sm);
2061
+ font-weight: var(--admin-font-medium);
2062
+ color: hsl(var(--admin-primary));
2063
+ text-decoration: none;
2064
+ transition: var(--admin-transition-colors);
2065
+ }
2066
+
2067
+ .rovela-admin-theme .admin-view-all-link:hover {
2068
+ color: hsl(var(--admin-primary-hover));
2069
+ }
2070
+
2071
+ /* ═══════════════════════════════════════════════════════════════════════════
2072
+ TABLE HEADER STYLES
2073
+ ═══════════════════════════════════════════════════════════════════════════ */
2074
+
2075
+ .rovela-admin-theme .admin-table-header {
2076
+ background: hsl(var(--admin-background-subtle));
2077
+ border-bottom: 1px solid hsl(var(--admin-border));
2078
+ }
2079
+
2080
+ .rovela-admin-theme .admin-table-header th {
2081
+ padding: var(--admin-space-3) var(--admin-space-4);
2082
+ font-size: var(--admin-text-xs);
2083
+ font-weight: var(--admin-font-medium);
2084
+ text-transform: uppercase;
2085
+ letter-spacing: var(--admin-tracking-wide);
2086
+ color: hsl(var(--admin-foreground-muted));
2087
+ text-align: left;
2088
+ }
2089
+
2090
+ /* ═══════════════════════════════════════════════════════════════════════════
2091
+ INVENTORY ITEM STYLES
2092
+ ═══════════════════════════════════════════════════════════════════════════ */
2093
+
2094
+ /* Low stock item row - pure CSS hover */
2095
+ .rovela-admin-theme .admin-inventory-item {
2096
+ display: flex;
2097
+ align-items: center;
2098
+ justify-content: space-between;
2099
+ padding: var(--admin-space-4) var(--admin-space-6);
2100
+ border-bottom: 1px solid hsl(var(--admin-border));
2101
+ transition: var(--admin-transition-colors);
2102
+ }
2103
+
2104
+ .rovela-admin-theme .admin-inventory-item:hover {
2105
+ background: hsl(var(--admin-background-subtle));
2106
+ }
2107
+
2108
+ .rovela-admin-theme .admin-inventory-item:last-child {
2109
+ border-bottom: none;
2110
+ }
2111
+
2112
+ /* Product link within inventory item */
2113
+ .rovela-admin-theme .admin-inventory-item-link {
2114
+ display: block;
2115
+ font-weight: var(--admin-font-medium);
2116
+ color: hsl(var(--admin-foreground));
2117
+ text-decoration: none;
2118
+ transition: var(--admin-transition-colors);
2119
+ overflow: hidden;
2120
+ text-overflow: ellipsis;
2121
+ white-space: nowrap;
2122
+ }
2123
+
2124
+ .rovela-admin-theme .admin-inventory-item:hover .admin-inventory-item-link {
2125
+ color: hsl(var(--admin-primary));
2126
+ }
2127
+
2128
+ .rovela-admin-theme .admin-inventory-item-variant {
2129
+ font-size: var(--admin-text-sm);
2130
+ color: hsl(var(--admin-foreground-muted));
2131
+ overflow: hidden;
2132
+ text-overflow: ellipsis;
2133
+ white-space: nowrap;
2134
+ }
2135
+
2136
+ /* ═══════════════════════════════════════════════════════════════════════════
2137
+ PRODUCT STATUS BADGES
2138
+ ═══════════════════════════════════════════════════════════════════════════ */
2139
+
2140
+ .rovela-admin-theme .admin-badge-draft {
2141
+ background: hsl(var(--admin-background-subtle));
2142
+ color: hsl(var(--admin-foreground-muted));
2143
+ }
2144
+
2145
+ .rovela-admin-theme .admin-badge-active {
2146
+ background: hsl(var(--admin-success) / 0.1);
2147
+ color: hsl(var(--admin-success));
2148
+ }
2149
+
2150
+ .rovela-admin-theme .admin-badge-archived {
2151
+ background: hsl(var(--admin-error) / 0.1);
2152
+ color: hsl(var(--admin-error));
2153
+ }
2154
+
2155
+ /* ═══════════════════════════════════════════════════════════════════════════
2156
+ CUSTOMER VERIFICATION BADGES
2157
+ ═══════════════════════════════════════════════════════════════════════════ */
2158
+
2159
+ .rovela-admin-theme .admin-badge-verified {
2160
+ background: hsl(var(--admin-success) / 0.1);
2161
+ color: hsl(var(--admin-success));
2162
+ }
2163
+
2164
+ .rovela-admin-theme .admin-badge-unverified {
2165
+ background: hsl(var(--admin-warning) / 0.1);
2166
+ color: hsl(var(--admin-warning));
2167
+ }
2168
+
2169
+ /* ═══════════════════════════════════════════════════════════════════════════
2170
+ IMAGE PLACEHOLDER
2171
+ ═══════════════════════════════════════════════════════════════════════════ */
2172
+
2173
+ .rovela-admin-theme .admin-image-placeholder {
2174
+ display: flex;
2175
+ align-items: center;
2176
+ justify-content: center;
2177
+ background: hsl(var(--admin-background-subtle));
2178
+ color: hsl(var(--admin-foreground-muted));
2179
+ }
2180
+
2181
+ /* ═══════════════════════════════════════════════════════════════════════════
2182
+ ACTION LINKS
2183
+ ═══════════════════════════════════════════════════════════════════════════ */
2184
+
2185
+ .rovela-admin-theme .admin-action-link {
2186
+ font-size: var(--admin-text-sm);
2187
+ color: hsl(var(--admin-primary));
2188
+ text-decoration: none;
2189
+ transition: var(--admin-transition-colors);
2190
+ }
2191
+
2192
+ .rovela-admin-theme .admin-action-link:hover {
2193
+ text-decoration: underline;
2194
+ }
2195
+
2196
+ .rovela-admin-theme .admin-action-link-destructive {
2197
+ font-size: var(--admin-text-sm);
2198
+ color: hsl(var(--admin-error));
2199
+ text-decoration: none;
2200
+ transition: var(--admin-transition-colors);
2201
+ }
2202
+
2203
+ .rovela-admin-theme .admin-action-link-destructive:hover {
2204
+ text-decoration: underline;
2205
+ }
2206
+
2207
+ /* ═══════════════════════════════════════════════════════════════════════════
2208
+ CUSTOMER AVATAR
2209
+ ═══════════════════════════════════════════════════════════════════════════ */
2210
+
2211
+ .rovela-admin-theme .admin-customer-avatar {
2212
+ display: flex;
2213
+ align-items: center;
2214
+ justify-content: center;
2215
+ background: hsl(var(--admin-primary) / 0.1);
2216
+ color: hsl(var(--admin-primary));
2217
+ border-radius: var(--admin-radius-full);
2218
+ }
2219
+
2220
+ /* ═══════════════════════════════════════════════════════════════════════════
2221
+ INPUT WITH ICON
2222
+ ═══════════════════════════════════════════════════════════════════════════ */
2223
+
2224
+ .rovela-admin-theme .admin-input-with-icon {
2225
+ position: relative;
2226
+ }
2227
+
2228
+ .rovela-admin-theme .admin-input-with-icon .admin-input {
2229
+ padding-left: var(--admin-space-9);
2230
+ }
2231
+
2232
+ .rovela-admin-theme .admin-input-with-icon-left {
2233
+ position: absolute;
2234
+ left: var(--admin-space-3);
2235
+ top: 50%;
2236
+ transform: translateY(-50%);
2237
+ color: hsl(var(--admin-foreground-muted));
2238
+ pointer-events: none;
2239
+ }
2240
+
2241
+ /* ═══════════════════════════════════════════════════════════════════════════
2242
+ ALERT INLINE
2243
+ ═══════════════════════════════════════════════════════════════════════════ */
2244
+
2245
+ .rovela-admin-theme .admin-alert-inline {
2246
+ padding: var(--admin-space-3) var(--admin-space-4);
2247
+ border-radius: var(--admin-radius-md);
2248
+ font-size: var(--admin-text-sm);
2249
+ }
2250
+
2251
+ .rovela-admin-theme .admin-alert-inline-error {
2252
+ background: hsl(var(--admin-error) / 0.1);
2253
+ color: hsl(var(--admin-error));
2254
+ }
2255
+
2256
+ /* ═══════════════════════════════════════════════════════════════════════════
2257
+ CHART COMPONENTS
2258
+ ═══════════════════════════════════════════════════════════════════════════ */
2259
+
2260
+ /* Chart Container */
2261
+ .rovela-admin-theme .admin-chart {
2262
+ background: hsl(var(--admin-card));
2263
+ border: 1px solid hsl(var(--admin-border));
2264
+ border-radius: var(--admin-radius-lg);
2265
+ }
2266
+
2267
+ /* Chart Header */
2268
+ .rovela-admin-theme .admin-chart-header {
2269
+ display: flex;
2270
+ align-items: center;
2271
+ justify-content: space-between;
2272
+ padding: var(--admin-space-4) var(--admin-space-6);
2273
+ border-bottom: 1px solid hsl(var(--admin-border));
2274
+ }
2275
+
2276
+ .rovela-admin-theme .admin-chart-title {
2277
+ font-size: var(--admin-text-lg);
2278
+ font-weight: 600;
2279
+ color: hsl(var(--admin-foreground));
2280
+ }
2281
+
2282
+ .rovela-admin-theme .admin-chart-subtitle {
2283
+ font-size: var(--admin-text-sm);
2284
+ color: hsl(var(--admin-foreground-muted));
2285
+ }
2286
+
2287
+ .rovela-admin-theme .admin-chart-value {
2288
+ font-size: var(--admin-text-2xl);
2289
+ font-weight: 700;
2290
+ color: hsl(var(--admin-foreground));
2291
+ }
2292
+
2293
+ .rovela-admin-theme .admin-chart-value-label {
2294
+ font-size: var(--admin-text-xs);
2295
+ color: hsl(var(--admin-foreground-muted));
2296
+ }
2297
+
2298
+ /* Chart Body */
2299
+ .rovela-admin-theme .admin-chart-body {
2300
+ padding: var(--admin-space-6);
2301
+ }
2302
+
2303
+ /* Chart Loading State */
2304
+ .rovela-admin-theme .admin-chart-loading {
2305
+ display: flex;
2306
+ height: 16rem;
2307
+ align-items: center;
2308
+ justify-content: center;
2309
+ }
2310
+
2311
+ .rovela-admin-theme .admin-chart-spinner {
2312
+ width: 2rem;
2313
+ height: 2rem;
2314
+ border: 2px solid hsl(var(--admin-primary));
2315
+ border-top-color: transparent;
2316
+ border-radius: var(--admin-radius-full);
2317
+ animation: admin-spin 0.75s linear infinite;
2318
+ }
2319
+
2320
+ /* Chart Empty State */
2321
+ .rovela-admin-theme .admin-chart-empty {
2322
+ display: flex;
2323
+ flex-direction: column;
2324
+ align-items: center;
2325
+ justify-content: center;
2326
+ height: 16rem;
2327
+ text-align: center;
2328
+ }
2329
+
2330
+ .rovela-admin-theme .admin-chart-empty-icon {
2331
+ color: hsl(var(--admin-foreground-muted) / 0.3);
2332
+ }
2333
+
2334
+ .rovela-admin-theme .admin-chart-empty-text {
2335
+ margin-top: var(--admin-space-4);
2336
+ font-size: var(--admin-text-sm);
2337
+ color: hsl(var(--admin-foreground-muted));
2338
+ }
2339
+
2340
+ .rovela-admin-theme .admin-chart-empty-subtext {
2341
+ font-size: var(--admin-text-xs);
2342
+ color: hsl(var(--admin-foreground-muted) / 0.7);
2343
+ }
2344
+
2345
+ /* Chart Tooltip */
2346
+ .rovela-admin-theme .admin-chart-tooltip {
2347
+ padding: var(--admin-space-2) var(--admin-space-3);
2348
+ background: hsl(var(--admin-card));
2349
+ border: 1px solid hsl(var(--admin-border));
2350
+ border-radius: var(--admin-radius-lg);
2351
+ box-shadow: var(--admin-shadow-lg);
2352
+ }
2353
+
2354
+ .rovela-admin-theme .admin-chart-tooltip-label {
2355
+ font-size: var(--admin-text-xs);
2356
+ color: hsl(var(--admin-foreground-muted));
2357
+ }
2358
+
2359
+ .rovela-admin-theme .admin-chart-tooltip-value {
2360
+ font-size: var(--admin-text-sm);
2361
+ font-weight: 600;
2362
+ color: hsl(var(--admin-foreground));
2363
+ }
2364
+
2365
+ /* Chart Legend */
2366
+ .rovela-admin-theme .admin-chart-legend {
2367
+ flex: 1;
2368
+ display: flex;
2369
+ flex-direction: column;
2370
+ gap: var(--admin-space-2);
2371
+ }
2372
+
2373
+ .rovela-admin-theme .admin-chart-legend-item {
2374
+ display: flex;
2375
+ align-items: center;
2376
+ justify-content: space-between;
2377
+ }
2378
+
2379
+ .rovela-admin-theme .admin-chart-legend-label {
2380
+ display: flex;
2381
+ align-items: center;
2382
+ gap: var(--admin-space-2);
2383
+ }
2384
+
2385
+ .rovela-admin-theme .admin-chart-legend-dot {
2386
+ width: 0.75rem;
2387
+ height: 0.75rem;
2388
+ border-radius: var(--admin-radius-full);
2389
+ }
2390
+
2391
+ .rovela-admin-theme .admin-chart-legend-text {
2392
+ font-size: var(--admin-text-sm);
2393
+ color: hsl(var(--admin-foreground));
2394
+ }
2395
+
2396
+ .rovela-admin-theme .admin-chart-legend-value {
2397
+ font-size: var(--admin-text-sm);
2398
+ font-weight: 500;
2399
+ color: hsl(var(--admin-foreground));
2400
+ }
2401
+
2402
+ .rovela-admin-theme .admin-chart-legend-percentage {
2403
+ font-size: var(--admin-text-xs);
2404
+ color: hsl(var(--admin-foreground-muted));
2405
+ }
2406
+
2407
+ /* Donut Chart Center Text */
2408
+ .rovela-admin-theme .admin-chart-center {
2409
+ position: absolute;
2410
+ inset: 0;
2411
+ display: flex;
2412
+ flex-direction: column;
2413
+ align-items: center;
2414
+ justify-content: center;
2415
+ }
2416
+
2417
+ .rovela-admin-theme .admin-chart-center-value {
2418
+ font-size: var(--admin-text-2xl);
2419
+ font-weight: 700;
2420
+ color: hsl(var(--admin-foreground));
2421
+ }
2422
+
2423
+ .rovela-admin-theme .admin-chart-center-label {
2424
+ font-size: var(--admin-text-xs);
2425
+ color: hsl(var(--admin-foreground-muted));
2426
+ }
2427
+
2428
+ /* ═══════════════════════════════════════════════════════════════════════════
2429
+ TEXT UTILITY CLASSES
2430
+ ═══════════════════════════════════════════════════════════════════════════ */
2431
+
2432
+ .rovela-admin-theme .admin-text {
2433
+ color: hsl(var(--admin-foreground));
2434
+ }
2435
+
2436
+ .rovela-admin-theme .admin-text-primary {
2437
+ color: hsl(var(--admin-primary));
2438
+ }
2439
+
2440
+ .rovela-admin-theme .admin-text-error {
2441
+ color: hsl(var(--admin-error));
2442
+ }
2443
+
2444
+ .rovela-admin-theme .admin-text-success {
2445
+ color: hsl(var(--admin-success));
2446
+ }
2447
+
2448
+ .rovela-admin-theme .admin-text-warning {
2449
+ color: hsl(var(--admin-warning));
2450
+ }
2451
+
2452
+ /* ═══════════════════════════════════════════════════════════════════════════
2453
+ ICON UTILITY CLASSES
2454
+ ═══════════════════════════════════════════════════════════════════════════ */
2455
+
2456
+ .rovela-admin-theme .admin-icon-muted {
2457
+ color: hsl(var(--admin-foreground-muted));
2458
+ }
2459
+
2460
+ .rovela-admin-theme .admin-icon-primary {
2461
+ color: hsl(var(--admin-primary));
2462
+ }
2463
+
2464
+ .rovela-admin-theme .admin-icon-error {
2465
+ color: hsl(var(--admin-error));
2466
+ }
2467
+
2468
+ .rovela-admin-theme .admin-icon-success {
2469
+ color: hsl(var(--admin-success));
2470
+ }
2471
+
2472
+ /* ═══════════════════════════════════════════════════════════════════════════
2473
+ SPINNER SIZE VARIANTS
2474
+ ═══════════════════════════════════════════════════════════════════════════ */
2475
+
2476
+ .rovela-admin-theme .admin-spinner-sm {
2477
+ width: 1rem;
2478
+ height: 1rem;
2479
+ }
2480
+
2481
+ .rovela-admin-theme .admin-spinner-lg {
2482
+ width: 2rem;
2483
+ height: 2rem;
2484
+ }
2485
+
2486
+ /* ═══════════════════════════════════════════════════════════════════════════
2487
+ CARD VARIANTS
2488
+ ═══════════════════════════════════════════════════════════════════════════ */
2489
+
2490
+ .rovela-admin-theme .admin-card-subtle {
2491
+ background: hsl(var(--admin-background-subtle));
2492
+ }
2493
+
2494
+ /* ═══════════════════════════════════════════════════════════════════════════
2495
+ SECTION LAYOUT CLASSES
2496
+ ═══════════════════════════════════════════════════════════════════════════ */
2497
+
2498
+ .rovela-admin-theme .admin-section-title {
2499
+ font-size: var(--admin-text-lg);
2500
+ font-weight: var(--admin-font-semibold);
2501
+ color: hsl(var(--admin-foreground));
2502
+ }
2503
+
2504
+ .rovela-admin-theme .admin-section-subtitle {
2505
+ font-size: var(--admin-text-sm);
2506
+ color: hsl(var(--admin-foreground-muted));
2507
+ }
2508
+
2509
+ /* ═══════════════════════════════════════════════════════════════════════════
2510
+ CUSTOM SELECT/DROPDOWN COMPONENTS
2511
+ ═══════════════════════════════════════════════════════════════════════════ */
2512
+
2513
+ .rovela-admin-theme .admin-select-trigger {
2514
+ display: flex;
2515
+ align-items: center;
2516
+ justify-content: space-between;
2517
+ width: 100%;
2518
+ padding: var(--admin-space-2) var(--admin-space-3);
2519
+ background: hsl(var(--admin-card));
2520
+ border: 1px solid hsl(var(--admin-border));
2521
+ border-radius: var(--admin-radius-md);
2522
+ color: hsl(var(--admin-foreground));
2523
+ font-size: var(--admin-text-sm);
2524
+ cursor: pointer;
2525
+ transition: var(--admin-transition-colors);
2526
+ }
2527
+
2528
+ .rovela-admin-theme .admin-select-trigger:hover:not(:disabled) {
2529
+ border-color: hsl(var(--admin-border-hover));
2530
+ }
2531
+
2532
+ .rovela-admin-theme .admin-select-trigger:disabled {
2533
+ background: hsl(var(--admin-background-subtle));
2534
+ color: hsl(var(--admin-foreground-muted));
2535
+ cursor: not-allowed;
2536
+ }
2537
+
2538
+ .rovela-admin-theme .admin-select-placeholder {
2539
+ color: hsl(var(--admin-foreground-muted));
2540
+ }
2541
+
2542
+ .rovela-admin-theme .admin-select-dropdown {
2543
+ position: absolute;
2544
+ z-index: var(--admin-z-dropdown);
2545
+ margin-top: var(--admin-space-1);
2546
+ width: 100%;
2547
+ background: hsl(var(--admin-card));
2548
+ border: 1px solid hsl(var(--admin-border));
2549
+ border-radius: var(--admin-radius-md);
2550
+ box-shadow: var(--admin-shadow-lg);
2551
+ }
2552
+
2553
+ .rovela-admin-theme .admin-select-search {
2554
+ padding: var(--admin-space-2);
2555
+ border-bottom: 1px solid hsl(var(--admin-border));
2556
+ }
2557
+
2558
+ .rovela-admin-theme .admin-select-list {
2559
+ max-height: 15rem;
2560
+ overflow-y: auto;
2561
+ padding: var(--admin-space-1);
2562
+ }
2563
+
2564
+ .rovela-admin-theme .admin-select-item {
2565
+ display: flex;
2566
+ align-items: center;
2567
+ gap: var(--admin-space-2);
2568
+ padding: var(--admin-space-2) var(--admin-space-3);
2569
+ border-radius: var(--admin-radius-sm);
2570
+ color: hsl(var(--admin-foreground));
2571
+ font-size: var(--admin-text-sm);
2572
+ cursor: pointer;
2573
+ transition: var(--admin-transition-colors);
2574
+ }
2575
+
2576
+ .rovela-admin-theme .admin-select-item:hover {
2577
+ background: hsl(var(--admin-background-subtle));
2578
+ }
2579
+
2580
+ .rovela-admin-theme .admin-select-item-selected {
2581
+ background: hsl(var(--admin-primary) / 0.1);
2582
+ color: hsl(var(--admin-primary));
2583
+ }
2584
+
2585
+ .rovela-admin-theme .admin-select-empty {
2586
+ padding: var(--admin-space-6) var(--admin-space-3);
2587
+ text-align: center;
2588
+ color: hsl(var(--admin-foreground-muted));
2589
+ font-size: var(--admin-text-sm);
2590
+ }
2591
+
2592
+ .rovela-admin-theme .admin-select-add {
2593
+ padding: var(--admin-space-1);
2594
+ border-top: 1px solid hsl(var(--admin-border));
2595
+ }
2596
+
2597
+ .rovela-admin-theme .admin-select-add-btn {
2598
+ display: flex;
2599
+ align-items: center;
2600
+ gap: var(--admin-space-2);
2601
+ width: 100%;
2602
+ padding: var(--admin-space-2) var(--admin-space-3);
2603
+ border-radius: var(--admin-radius-sm);
2604
+ color: hsl(var(--admin-primary));
2605
+ font-size: var(--admin-text-sm);
2606
+ cursor: pointer;
2607
+ transition: var(--admin-transition-colors);
2608
+ }
2609
+
2610
+ .rovela-admin-theme .admin-select-add-btn:hover {
2611
+ background: hsl(var(--admin-primary) / 0.1);
2612
+ }
2613
+
2614
+ /* ═══════════════════════════════════════════════════════════════════════════
2615
+ SEO PREVIEW COMPONENT (Google-style)
2616
+ ═══════════════════════════════════════════════════════════════════════════ */
2617
+
2618
+ .rovela-admin-theme .admin-seo-preview {
2619
+ padding: var(--admin-space-4);
2620
+ background: hsl(var(--admin-background-subtle));
2621
+ border: 1px solid hsl(var(--admin-border));
2622
+ border-radius: var(--admin-radius-md);
2623
+ }
2624
+
2625
+ .rovela-admin-theme .admin-seo-preview-label {
2626
+ font-size: var(--admin-text-xs);
2627
+ font-weight: var(--admin-font-medium);
2628
+ color: hsl(var(--admin-foreground-muted));
2629
+ margin-bottom: var(--admin-space-3);
2630
+ }
2631
+
2632
+ .rovela-admin-theme .admin-seo-preview-title {
2633
+ font-size: var(--admin-text-lg);
2634
+ font-weight: var(--admin-font-normal);
2635
+ color: #1a0dab;
2636
+ line-height: var(--admin-leading-tight);
2637
+ cursor: pointer;
2638
+ }
2639
+
2640
+ .rovela-admin-theme .admin-seo-preview-title:hover {
2641
+ text-decoration: underline;
2642
+ }
2643
+
2644
+ .rovela-admin-theme .admin-seo-preview-url {
2645
+ font-size: var(--admin-text-sm);
2646
+ color: #006621;
2647
+ margin-top: var(--admin-space-1);
2648
+ }
2649
+
2650
+ .rovela-admin-theme .admin-seo-preview-description {
2651
+ font-size: var(--admin-text-sm);
2652
+ color: #545454;
2653
+ line-height: var(--admin-leading-relaxed);
2654
+ margin-top: var(--admin-space-1);
2655
+ }
2656
+
2657
+ /* ═══════════════════════════════════════════════════════════════════════════
2658
+ TAG INPUT COMPONENT
2659
+ ═══════════════════════════════════════════════════════════════════════════ */
2660
+
2661
+ .rovela-admin-theme .admin-tag-input {
2662
+ display: flex;
2663
+ flex-wrap: wrap;
2664
+ align-items: center;
2665
+ gap: var(--admin-space-1-5);
2666
+ padding: var(--admin-space-2) var(--admin-space-3);
2667
+ background: hsl(var(--admin-card));
2668
+ border: 1px solid hsl(var(--admin-border));
2669
+ border-radius: var(--admin-radius-md);
2670
+ cursor: text;
2671
+ transition: var(--admin-transition-colors);
2672
+ }
2673
+
2674
+ .rovela-admin-theme .admin-tag-input:focus-within {
2675
+ border-color: hsl(var(--admin-primary));
2676
+ box-shadow: 0 0 0 3px hsl(var(--admin-primary) / 0.1);
2677
+ }
2678
+
2679
+ .rovela-admin-theme .admin-tag-input:disabled,
2680
+ .rovela-admin-theme .admin-tag-input[data-disabled="true"] {
2681
+ background: hsl(var(--admin-background-subtle));
2682
+ cursor: not-allowed;
2683
+ }
2684
+
2685
+ .rovela-admin-theme .admin-tag-input-field {
2686
+ flex: 1;
2687
+ min-width: 60px;
2688
+ border: none;
2689
+ outline: none;
2690
+ background: transparent;
2691
+ color: hsl(var(--admin-foreground));
2692
+ font-size: var(--admin-text-sm);
2693
+ }
2694
+
2695
+ .rovela-admin-theme .admin-tag-input-field::placeholder {
2696
+ color: hsl(var(--admin-foreground-subtle));
2697
+ }
2698
+
2699
+ .rovela-admin-theme .admin-tag-max {
2700
+ font-size: var(--admin-text-xs);
2701
+ color: hsl(var(--admin-foreground-muted));
2702
+ }
2703
+
2704
+ /* ═══════════════════════════════════════════════════════════════════════════
2705
+ EMPTY STATE VARIANTS
2706
+ ═══════════════════════════════════════════════════════════════════════════ */
2707
+
2708
+ .rovela-admin-theme .admin-empty-dashed {
2709
+ border: 1px dashed hsl(var(--admin-border));
2710
+ border-radius: var(--admin-radius-lg);
2711
+ padding: var(--admin-space-8);
2712
+ text-align: center;
2713
+ }
2714
+
2715
+ /* ═══════════════════════════════════════════════════════════════════════════
2716
+ PAGE BACKGROUND
2717
+ ═══════════════════════════════════════════════════════════════════════════ */
2718
+
2719
+ .rovela-admin-theme .admin-page-bg {
2720
+ background: hsl(var(--admin-background));
2721
+ }
2722
+
2723
+ /* ═══════════════════════════════════════════════════════════════════════════
2724
+ SUMMARY/DIVIDER UTILITIES
2725
+ ═══════════════════════════════════════════════════════════════════════════ */
2726
+
2727
+ .rovela-admin-theme .admin-summary-divider {
2728
+ border-top: 1px solid hsl(var(--admin-border));
2729
+ margin-top: var(--admin-space-2);
2730
+ padding-top: var(--admin-space-2);
2731
+ }
2732
+
2733
+ /* ═══════════════════════════════════════════════════════════════════════════
2734
+ INLINE INPUT VARIANT (for tables/inline editing)
2735
+ ═══════════════════════════════════════════════════════════════════════════ */
2736
+
2737
+ .rovela-admin-theme .admin-input-inline {
2738
+ height: auto;
2739
+ padding: var(--admin-space-1) var(--admin-space-2);
2740
+ font-size: var(--admin-text-sm);
2741
+ }
2742
+
2743
+ /* ═══════════════════════════════════════════════════════════════════════════
2744
+ ATTRIBUTE BADGE (for variant attributes)
2745
+ ═══════════════════════════════════════════════════════════════════════════ */
2746
+
2747
+ .rovela-admin-theme .admin-attribute-badge {
2748
+ display: inline-flex;
2749
+ padding: var(--admin-space-0-5) var(--admin-space-1-5);
2750
+ background: hsl(var(--admin-background-subtle));
2751
+ color: hsl(var(--admin-foreground-muted));
2752
+ border-radius: var(--admin-radius-sm);
2753
+ font-size: var(--admin-text-xs);
2754
+ }
2755
+
2756
+ /* ═══════════════════════════════════════════════════════════════════════════
2757
+ INPUT GROUP WITH PREFIX
2758
+ ═══════════════════════════════════════════════════════════════════════════ */
2759
+
2760
+ .rovela-admin-theme .admin-input-group {
2761
+ display: flex;
2762
+ border: 1px solid hsl(var(--admin-border));
2763
+ border-radius: var(--admin-radius-md);
2764
+ overflow: hidden;
2765
+ }
2766
+
2767
+ .rovela-admin-theme .admin-input-group:focus-within {
2768
+ border-color: hsl(var(--admin-primary));
2769
+ box-shadow: 0 0 0 3px hsl(var(--admin-primary) / 0.1);
2770
+ }
2771
+
2772
+ .rovela-admin-theme .admin-input-prefix {
2773
+ display: inline-flex;
2774
+ align-items: center;
2775
+ padding: 0 var(--admin-space-3);
2776
+ background: hsl(var(--admin-background-subtle));
2777
+ border-right: 1px solid hsl(var(--admin-border));
2778
+ color: hsl(var(--admin-foreground-muted));
2779
+ font-size: var(--admin-text-sm);
2780
+ white-space: nowrap;
2781
+ }
2782
+
2783
+ .rovela-admin-theme .admin-input-group .admin-input-borderless {
2784
+ flex: 1;
2785
+ border: none;
2786
+ border-radius: 0;
2787
+ background: hsl(var(--admin-card));
2788
+ }
2789
+
2790
+ .rovela-admin-theme .admin-input-group .admin-input-borderless:focus {
2791
+ box-shadow: none;
2792
+ }
2793
+
2794
+ /* ═══════════════════════════════════════════════════════════════════════════
2795
+ INPUT WITH ADDON (currency symbol, etc.)
2796
+ ═══════════════════════════════════════════════════════════════════════════ */
2797
+
2798
+ .rovela-admin-theme .admin-input-with-addon {
2799
+ position: relative;
2800
+ }
2801
+
2802
+ .rovela-admin-theme .admin-input-addon-left {
2803
+ position: absolute;
2804
+ left: var(--admin-space-3);
2805
+ top: 50%;
2806
+ transform: translateY(-50%);
2807
+ color: hsl(var(--admin-foreground-muted));
2808
+ pointer-events: none;
2809
+ }
2810
+
2811
+ .rovela-admin-theme .admin-input-with-addon .admin-input {
2812
+ padding-left: var(--admin-space-7);
2813
+ }
2814
+
2815
+ /* ═══════════════════════════════════════════════════════════════════════════
2816
+ OPTION CARD (for variant options)
2817
+ ═══════════════════════════════════════════════════════════════════════════ */
2818
+
2819
+ .rovela-admin-theme .admin-option-card {
2820
+ padding: var(--admin-space-4);
2821
+ background: hsl(var(--admin-card) / 0.5);
2822
+ border: 1px solid hsl(var(--admin-border));
2823
+ border-radius: var(--admin-radius-lg);
2824
+ }
2825
+
2826
+ /* ═══════════════════════════════════════════════════════════════════════════
2827
+ VALUE TAG (for variant values like "Red", "Blue")
2828
+ ═══════════════════════════════════════════════════════════════════════════ */
2829
+
2830
+ .rovela-admin-theme .admin-value-tag {
2831
+ display: inline-flex;
2832
+ align-items: center;
2833
+ gap: var(--admin-space-1);
2834
+ padding: var(--admin-space-1) var(--admin-space-3);
2835
+ background: hsl(var(--admin-primary) / 0.1);
2836
+ color: hsl(var(--admin-primary));
2837
+ border-radius: var(--admin-radius-full);
2838
+ font-size: var(--admin-text-sm);
2839
+ }
2840
+
2841
+ .rovela-admin-theme .admin-value-tag-remove {
2842
+ display: flex;
2843
+ align-items: center;
2844
+ justify-content: center;
2845
+ padding: 0;
2846
+ background: transparent;
2847
+ border: none;
2848
+ color: inherit;
2849
+ cursor: pointer;
2850
+ border-radius: var(--admin-radius-full);
2851
+ transition: var(--admin-transition-colors);
2852
+ }
2853
+
2854
+ .rovela-admin-theme .admin-value-tag-remove:hover {
2855
+ opacity: 0.7;
2856
+ }
2857
+
2858
+ /* ═══════════════════════════════════════════════════════════════════════════
2859
+ TOGGLE SWITCH (peer-based for forms)
2860
+ ═══════════════════════════════════════════════════════════════════════════ */
2861
+
2862
+ .rovela-admin-theme .admin-toggle-switch {
2863
+ position: relative;
2864
+ width: 2.75rem;
2865
+ height: 1.5rem;
2866
+ background: hsl(var(--admin-border));
2867
+ border-radius: var(--admin-radius-full);
2868
+ cursor: pointer;
2869
+ transition: var(--admin-transition-colors);
2870
+ }
2871
+
2872
+ .rovela-admin-theme .admin-toggle-switch::after {
2873
+ content: '';
2874
+ position: absolute;
2875
+ left: 2px;
2876
+ top: 2px;
2877
+ width: 1.25rem;
2878
+ height: 1.25rem;
2879
+ background: white;
2880
+ border-radius: var(--admin-radius-full);
2881
+ transition: var(--admin-transition-transform);
2882
+ }
2883
+
2884
+ .rovela-admin-theme .admin-toggle-switch[data-checked="true"],
2885
+ .rovela-admin-theme input:checked + .admin-toggle-switch {
2886
+ background: hsl(var(--admin-primary));
2887
+ }
2888
+
2889
+ .rovela-admin-theme .admin-toggle-switch[data-checked="true"]::after,
2890
+ .rovela-admin-theme input:checked + .admin-toggle-switch::after {
2891
+ transform: translateX(1.25rem);
2892
+ }
2893
+
2894
+ /* ═══════════════════════════════════════════════════════════════════════════
2895
+ IN-STOCK / LOW-STOCK / OUT-OF-STOCK BADGES
2896
+ ═══════════════════════════════════════════════════════════════════════════ */
2897
+
2898
+ .rovela-admin-theme .admin-badge-in-stock {
2899
+ background: hsl(var(--admin-success) / 0.1);
2900
+ color: hsl(var(--admin-success));
2901
+ }
2902
+
2903
+ /* ═══════════════════════════════════════════════════════════════════════════
2904
+ CLEAR BUTTON (for select/input)
2905
+ ═══════════════════════════════════════════════════════════════════════════ */
2906
+
2907
+ .rovela-admin-theme .admin-clear-btn {
2908
+ display: flex;
2909
+ align-items: center;
2910
+ justify-content: center;
2911
+ padding: var(--admin-space-0-5);
2912
+ border-radius: var(--admin-radius-sm);
2913
+ color: hsl(var(--admin-foreground-muted));
2914
+ cursor: pointer;
2915
+ transition: var(--admin-transition-colors);
2916
+ }
2917
+
2918
+ .rovela-admin-theme .admin-clear-btn:hover {
2919
+ color: hsl(var(--admin-foreground));
2920
+ background: hsl(var(--admin-background-subtle));
2921
+ }