@rovela-ai/sdk 0.15.4 → 0.16.1

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.
@@ -7,8 +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');
10
+ /* Plus Jakarta Sans arrives via next/font (template app/admin/layout.tsx sets
11
+ --admin-font-jakarta on the segment). No render-blocking @import — the
12
+ system stack below is the graceful fallback for stores on older templates. */
12
13
 
13
14
  /* ═══════════════════════════════════════════════════════════════════════════
14
15
  DESIGN TOKENS - CSS Variables
@@ -19,11 +20,18 @@
19
20
  COLOR PALETTE - Rovela Brand
20
21
  ───────────────────────────────────────────────────────────────────────── */
21
22
 
22
- /* Primary - Emerald */
23
+ /* Primary - Emerald. The accent is SCARCE by design: one primary button per
24
+ view, active nav, links. Status colors never borrow it. */
23
25
  --admin-primary: 163 86% 37%; /* #0CAF7D */
24
26
  --admin-primary-hover: 163 86% 32%; /* Darker on hover */
25
- --admin-primary-light: 163 86% 95%; /* Very light tint */
27
+ --admin-primary-active: 163 88% 28%; /* Pressed */
28
+ --admin-primary-light: 163 60% 93%; /* Tint for active nav / selections */
26
29
  --admin-primary-foreground: 0 0% 100%; /* White text on primary */
30
+ /* Accent alias — several class families (setup guide, highlights) reference
31
+ --admin-accent; it was previously UNDEFINED and those tints silently
32
+ failed. It aliases primary: one accent, everywhere. */
33
+ --admin-accent: 163 86% 37%;
34
+ --admin-accent-deep: 163 88% 26%; /* Readable accent text on tints */
27
35
 
28
36
  /* Backgrounds - Aligned with Rovela platform */
29
37
  --admin-background: 36 36% 95%; /* Warm Cream #F7F3ED - matches platform */
@@ -32,15 +40,16 @@
32
40
  --admin-sidebar: 36 20% 97%; /* Very light warm gray - blends with content */
33
41
  --admin-sidebar-hover: 36 15% 93%; /* Subtle hover */
34
42
  --admin-sidebar-border: 36 15% 88%; /* Very subtle border */
35
- --admin-sidebar-active: 163 86% 95%; /* Light primary bg for active */
36
- --admin-sidebar-active-text: 163 86% 37%; /* Primary color text */
37
-
38
- /* Text Colors */
39
- --admin-foreground: 220 20% 14%; /* Near-black text */
40
- --admin-foreground-muted: 220 10% 46%; /* Secondary text #6B7280 */
41
- --admin-foreground-subtle: 220 10% 64%; /* Tertiary/placeholder */
42
- --admin-sidebar-foreground: 220 15% 25%; /* Dark text for light sidebar */
43
- --admin-sidebar-foreground-muted: 220 10% 50%; /* Medium gray for inactive */
43
+ --admin-sidebar-active: 163 60% 93%; /* Tinted emerald for active */
44
+ --admin-sidebar-active-text: 163 88% 26%; /* Deep emerald readable on tint */
45
+
46
+ /* Text Colors — warm ink family (matches the platform's #2D3436 lineage;
47
+ the previous cool 220-hue grays clashed with the cream ground). */
48
+ --admin-foreground: 190 12% 17%; /* Warm near-black ink */
49
+ --admin-foreground-muted: 190 6% 42%; /* Secondary text (4.5:1 on cream) */
50
+ --admin-foreground-subtle: 190 5% 58%; /* Tertiary/placeholder */
51
+ --admin-sidebar-foreground: 190 10% 22%; /* Dark text for light sidebar */
52
+ --admin-sidebar-foreground-muted: 190 6% 44%; /* Medium gray for inactive */
44
53
  --admin-sidebar-logo-filter: none; /* Colored logo on light sidebar */
45
54
 
46
55
  /* Borders - Warm gray to match Rovela platform */
@@ -48,39 +57,57 @@
48
57
  --admin-border-hover: 36 15% 82%; /* Darker on hover */
49
58
  --admin-border-focus: 163 86% 37%; /* Primary on focus */
50
59
 
51
- /* Status Colors - Aligned with Rovela platform semantic colors */
52
- --admin-success: 168 100% 36%; /* Teal #00B894 - matches platform */
53
- --admin-success-light: 168 100% 95%; /* Light teal bg */
54
- --admin-success-dark: 168 100% 26%; /* Dark teal text */
55
- --admin-warning: 43 97% 71%; /* Warm yellow #FDCB6E - matches platform */
56
- --admin-warning-light: 43 97% 95%; /* Light yellow bg */
57
- --admin-warning-dark: 43 97% 40%; /* Dark yellow text */
58
- --admin-error: 0 100% 71%; /* Soft red #FF6B6B - matches platform */
59
- --admin-error-light: 0 100% 96%; /* Light red bg */
60
- --admin-error-dark: 0 100% 50%; /* Dark red text */
61
- --admin-info: 199 89% 48%; /* Blue #0984E3 - matches platform */
62
- --admin-info-light: 199 89% 96%; /* Light blue bg */
63
- --admin-info-dark: 199 89% 35%; /* Dark blue text */
60
+ /* Status TONES ONE recipe everywhere: `-light` = tinted background,
61
+ `-dark` = darker readable foreground (4.5:1 on its tint). Badges,
62
+ alerts and status chips all consume these pairs; never raw base colors
63
+ as text and never `base / 0.1` alpha tints (the old second recipe). */
64
+ --admin-success: 160 84% 33%; /* Green base (icons, accents) */
65
+ --admin-success-light: 152 48% 92%; /* #E2F5EC tinted bg */
66
+ --admin-success-dark: 159 83% 26%; /* #0B7A57 readable fg */
67
+ --admin-warning: 40 90% 50%; /* Amber base */
68
+ --admin-warning-light: 40 86% 92%; /* #FCF0D8 tinted bg */
69
+ --admin-warning-dark: 39 70% 31%; /* #8A6116 readable fg */
70
+ --admin-error: 4 74% 52%; /* Red base */
71
+ /* Alias several components (UsersTable, CustomerTable) and CC-generated
72
+ custom pages reference --admin-destructive; leaving it undefined renders
73
+ empty hsl() (the black-donut disease). Always mirror --admin-error. */
74
+ --admin-destructive: 4 74% 52%;
75
+ --admin-error-light: 5 81% 94%; /* #FCE5E3 tinted bg */
76
+ --admin-error-dark: 5 61% 44%; /* #B3372C readable fg */
77
+ --admin-error-foreground: 0 0% 100%; /* On solid error surfaces */
78
+ --admin-info: 210 70% 46%; /* Blue base */
79
+ --admin-info-light: 209 70% 94%; /* #E3EFFA tinted bg */
80
+ --admin-info-dark: 211 63% 40%; /* #2563A8 readable fg */
81
+ /* Attention — "needs a human" (unfulfilled, action required). Distinct from
82
+ warning: olive, calmer, non-alarming. New in the 2026-07 redesign. */
83
+ --admin-attention: 74 55% 40%;
84
+ --admin-attention-light: 70 48% 90%; /* #EEF2D9 tinted bg */
85
+ --admin-attention-dark: 71 58% 27%; /* #5F6E1D readable fg */
64
86
 
65
87
  /* ─────────────────────────────────────────────────────────────────────────
66
88
  TYPOGRAPHY - Plus Jakarta Sans
67
89
  ───────────────────────────────────────────────────────────────────────── */
68
- --admin-font-sans: 'Plus Jakarta Sans', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
90
+ --admin-font-sans: var(--admin-font-jakarta, 'Plus Jakarta Sans'), system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
69
91
  --admin-font-mono: 'SF Mono', 'Fira Code', 'Fira Mono', Menlo, Consolas, monospace;
70
92
 
71
93
  /* Override store font variables to use Rovela's Plus Jakarta Sans in admin */
72
94
  --font-heading: 'Plus Jakarta Sans', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
73
95
  --font-body: 'Plus Jakarta Sans', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
74
96
 
75
- /* Font Sizes */
76
- --admin-text-xs: 0.75rem; /* 12px */
77
- --admin-text-sm: 0.8125rem; /* 13px */
78
- --admin-text-base: 0.875rem; /* 14px - base for admin */
79
- --admin-text-md: 0.9375rem; /* 15px */
80
- --admin-text-lg: 1rem; /* 16px */
81
- --admin-text-xl: 1.125rem; /* 18px */
82
- --admin-text-2xl: 1.375rem; /* 22px */
83
- --admin-text-3xl: 1.625rem; /* 26px */
97
+ /* Font Sizes — the Polaris inversion (2026-07 redesign): headings barely
98
+ bigger than body, hierarchy through WEIGHT. 13px is the working size;
99
+ 20px page titles are the only large text. Deliberate collapses:
100
+ 2xl == 3xl (both 20px) so legacy consumers of either land on the same
101
+ page-title size. */
102
+ --admin-text-2xs: 0.6875rem; /* 11px - micro (counters, footnotes) */
103
+ --admin-text-xs: 0.75rem; /* 12px - meta, badges, helper text */
104
+ --admin-text-sm: 0.8125rem; /* 13px - body & tables (working size) */
105
+ --admin-text-base: 0.8125rem; /* 13px - base for admin (was 14) */
106
+ --admin-text-md: 0.875rem; /* 14px - card/section headings */
107
+ --admin-text-lg: 0.9375rem; /* 15px - modal titles, prominent rows */
108
+ --admin-text-xl: 1rem; /* 16px - rare emphasis */
109
+ --admin-text-2xl: 1.25rem; /* 20px - stat values, page titles */
110
+ --admin-text-3xl: 1.25rem; /* 20px - page titles (was 26) */
84
111
 
85
112
  /* Font Weights */
86
113
  --admin-font-normal: 400;
@@ -93,10 +120,10 @@
93
120
  --admin-leading-normal: 1.5;
94
121
  --admin-leading-relaxed: 1.625;
95
122
 
96
- /* Letter Spacing */
97
- --admin-tracking-tight: -0.025em;
123
+ /* Letter Spacing — negative tracking only at 20px+; eyebrows get +0.06em */
124
+ --admin-tracking-tight: -0.01em;
98
125
  --admin-tracking-normal: 0;
99
- --admin-tracking-wide: 0.05em;
126
+ --admin-tracking-wide: 0.06em;
100
127
 
101
128
  /* ─────────────────────────────────────────────────────────────────────────
102
129
  SPACING SCALE (8px base)
@@ -123,13 +150,17 @@
123
150
  /* ─────────────────────────────────────────────────────────────────────────
124
151
  BORDERS & RADIUS - Aligned with Rovela platform scale
125
152
  ───────────────────────────────────────────────────────────────────────── */
153
+ /* One radius language (2026-07 redesign): 6px controls & badges, 10px
154
+ cards & tables, 12px modals. Never larger on functional surfaces — the
155
+ oversized-radius look is the #1 generic-dashboard tell. sm == md is a
156
+ deliberate collapse (both are "control" radius). */
126
157
  --admin-radius-none: 0;
127
- --admin-radius-xs: 0.25rem; /* 4px - XS - tiny elements */
128
- --admin-radius-sm: 0.5rem; /* 8px - SM - small elements, inputs */
129
- --admin-radius-md: 0.75rem; /* 12px - MD (default) - buttons, cards */
130
- --admin-radius-lg: 1rem; /* 16px - LG - large cards, modals */
131
- --admin-radius-xl: 1.5rem; /* 24px - XL - hero sections */
132
- --admin-radius-2xl: 2rem; /* 32px - 2XL - extra large */
158
+ --admin-radius-xs: 0.25rem; /* 4px - tiny elements */
159
+ --admin-radius-sm: 0.375rem; /* 6px - controls, badges, inputs */
160
+ --admin-radius-md: 0.375rem; /* 6px - buttons (was 12) */
161
+ --admin-radius-lg: 0.625rem; /* 10px - cards, tables (was 16) */
162
+ --admin-radius-xl: 0.75rem; /* 12px - modals (was 24) */
163
+ --admin-radius-2xl: 1rem; /* 16px (was 32) */
133
164
  --admin-radius-full: 9999px; /* Pills, avatars */
134
165
 
135
166
  /* Border Widths */
@@ -139,19 +170,22 @@
139
170
  /* ─────────────────────────────────────────────────────────────────────────
140
171
  SHADOWS - Aligned with Rovela platform shadow system
141
172
  ───────────────────────────────────────────────────────────────────────── */
142
- /* Fine-grained elevation scale */
143
- --admin-shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.03);
144
- --admin-shadow-sm: 0 2px 4px rgb(0 0 0 / 0.05); /* Platform: shadow-rovela-sm */
145
- --admin-shadow-md: 0 4px 12px rgb(0 0 0 / 0.08); /* Platform: shadow-rovela-md */
146
- --admin-shadow-lg: 0 8px 24px rgb(0 0 0 / 0.12); /* Platform: shadow-rovela-lg */
147
- --admin-shadow-xl: 0 16px 48px rgb(0 0 0 / 0.16); /* Platform: shadow-rovela-xl */
148
- --admin-shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.20);
149
-
150
- /* Platform shadow aliases for direct compatibility */
151
- --shadow-rovela-sm: 0 2px 4px rgba(0, 0, 0, 0.05);
152
- --shadow-rovela-md: 0 4px 12px rgba(0, 0, 0, 0.08);
153
- --shadow-rovela-lg: 0 8px 24px rgba(0, 0, 0, 0.12);
154
- --shadow-rovela-xl: 0 16px 48px rgba(0, 0, 0, 0.16);
173
+ /* Fine-grained elevation scale — whispers, not drops. Hairline borders do
174
+ the separating; shadows only hint at elevation (cards) or float layers
175
+ (dropdowns, modals). */
176
+ --admin-shadow-xs: 0 1px 2px 0 rgb(24 34 33 / 0.03);
177
+ --admin-shadow-sm: 0 1px 2px rgb(24 34 33 / 0.04);
178
+ --admin-shadow-md: 0 2px 8px -2px rgb(24 34 33 / 0.08);
179
+ --admin-shadow-lg: 0 8px 24px -8px rgb(24 34 33 / 0.14);
180
+ --admin-shadow-xl: 0 16px 40px -12px rgb(24 34 33 / 0.18);
181
+ --admin-shadow-2xl: 0 24px 48px -12px rgb(24 34 33 / 0.22);
182
+
183
+ /* Platform shadow aliases SAME values as the scale above (they were a
184
+ duplicated parallel system; now they alias). */
185
+ --shadow-rovela-sm: var(--admin-shadow-sm);
186
+ --shadow-rovela-md: var(--admin-shadow-md);
187
+ --shadow-rovela-lg: var(--admin-shadow-lg);
188
+ --shadow-rovela-xl: var(--admin-shadow-xl);
155
189
 
156
190
  /* Colored Shadows - Primary emerald glow */
157
191
  --admin-shadow-primary-sm: 0 2px 8px 0 hsl(163 86% 37% / 0.12);
@@ -168,17 +202,21 @@
168
202
  /* ─────────────────────────────────────────────────────────────────────────
169
203
  TRANSITIONS & ANIMATIONS - Aligned with Rovela platform timing
170
204
  ───────────────────────────────────────────────────────────────────────── */
171
- --admin-transition-fast: 150ms ease-out; /* Platform: duration-fast */
172
- --admin-transition-base: 250ms ease-out; /* Platform: duration-normal */
173
- --admin-transition-slow: 400ms ease-out; /* Platform: duration-slow */
174
- --admin-transition-slower: 500ms ease-out; /* Extended slow */
175
-
176
- /* Specific transitions - using aligned base timing */
177
- --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;
178
- --admin-transition-opacity: opacity 250ms ease-out;
179
- --admin-transition-shadow: box-shadow 250ms ease-out;
180
- --admin-transition-transform: transform 250ms ease-out;
181
- --admin-transition-all: all 250ms ease-out;
205
+ /* Snappy, decisive timing (2026-07 redesign): 140ms for color/state
206
+ feedback, 180ms for anything that moves. 250ms read as laggy at admin
207
+ interaction density. */
208
+ --admin-ease: cubic-bezier(0.2, 0, 0.2, 1);
209
+ --admin-transition-fast: 140ms var(--admin-ease);
210
+ --admin-transition-base: 180ms var(--admin-ease);
211
+ --admin-transition-slow: 280ms var(--admin-ease);
212
+ --admin-transition-slower: 360ms var(--admin-ease);
213
+
214
+ /* Specific transitions */
215
+ --admin-transition-colors: color 140ms var(--admin-ease), background-color 140ms var(--admin-ease), border-color 140ms var(--admin-ease), fill 140ms var(--admin-ease), stroke 140ms var(--admin-ease);
216
+ --admin-transition-opacity: opacity 140ms var(--admin-ease);
217
+ --admin-transition-shadow: box-shadow 180ms var(--admin-ease);
218
+ --admin-transition-transform: transform 180ms var(--admin-ease);
219
+ --admin-transition-all: color 140ms var(--admin-ease), background-color 140ms var(--admin-ease), border-color 140ms var(--admin-ease), box-shadow 180ms var(--admin-ease), transform 120ms var(--admin-ease), opacity 140ms var(--admin-ease);
182
220
 
183
221
  /* Rovela Easing - matches platform timing */
184
222
  --admin-ease-rovela: cubic-bezier(0.25, 0.1, 0.25, 1);
@@ -221,230 +259,13 @@
221
259
  }
222
260
 
223
261
  /* ═══════════════════════════════════════════════════════════════════════════
224
- DARK MODE SUPPORT - Aligned with Rovela platform .dark class
262
+ NO DARK MODE deliberate (2026-07 redesign).
263
+ The Rovela platform is light-only (forcedTheme="light"); the admin matches.
264
+ The previous dark support was ~210 triplicated lines (media query + .dark
265
+ class + .dark ancestor) that fractured the brand and doubled the QA surface.
266
+ Do not reintroduce without a platform-wide dark-mode decision.
225
267
  ═══════════════════════════════════════════════════════════════════════════ */
226
268
 
227
- /* Dark mode via prefers-color-scheme media query */
228
- @media (prefers-color-scheme: dark) {
229
- .rovela-admin-theme:not(.light) {
230
- /* Backgrounds - Dark blue-gray palette */
231
- --admin-background: 200 10% 10%; /* Dark blue-gray */
232
- --admin-background-subtle: 200 10% 14%; /* Slightly lighter */
233
- --admin-card: 200 10% 14%; /* Card surfaces */
234
- --admin-sidebar: 200 10% 12%; /* Slightly lighter than content bg */
235
- --admin-sidebar-hover: 200 10% 18%; /* Visible hover */
236
- --admin-sidebar-border: 200 10% 20%; /* Subtle border */
237
- --admin-sidebar-active: 163 86% 15%; /* Dark primary bg for active */
238
- --admin-sidebar-active-text: 163 86% 45%; /* Primary color text */
239
-
240
- /* Text Colors - Inverted for dark mode */
241
- --admin-foreground: 36 36% 95%; /* Cream text */
242
- --admin-foreground-muted: 196 6% 60%; /* Muted text */
243
- --admin-foreground-subtle: 196 6% 50%; /* Subtle text */
244
- --admin-sidebar-foreground: 200 10% 90%; /* Light text for dark sidebar */
245
- --admin-sidebar-foreground-muted: 200 10% 60%; /* Muted gray for inactive */
246
- --admin-sidebar-logo-filter: brightness(0) invert(1); /* White logo on dark sidebar */
247
-
248
- /* Primary - Brighter emerald for dark mode */
249
- --admin-primary: 163 86% 45%; /* Brighter emerald */
250
- --admin-primary-hover: 163 86% 50%; /* Even brighter on hover */
251
- --admin-primary-light: 163 86% 20%; /* Muted primary for backgrounds */
252
- --admin-primary-foreground: 200 10% 10%; /* Dark text on primary */
253
-
254
- /* Borders - Darker warm gray */
255
- --admin-border: 200 10% 20%; /* Dark border */
256
- --admin-border-hover: 200 10% 25%; /* Slightly lighter on hover */
257
- --admin-border-focus: 163 86% 45%; /* Brighter primary on focus */
258
-
259
- /* Status Colors - Adjusted for dark mode visibility */
260
- --admin-success: 168 100% 40%; /* Brighter teal */
261
- --admin-success-light: 168 100% 15%; /* Dark teal bg */
262
- --admin-success-dark: 168 100% 60%; /* Light teal text */
263
- --admin-warning: 43 97% 50%; /* Adjusted yellow */
264
- --admin-warning-light: 43 97% 15%; /* Dark yellow bg */
265
- --admin-warning-dark: 43 97% 70%; /* Light yellow text */
266
- --admin-error: 0 100% 65%; /* Brighter red */
267
- --admin-error-light: 0 100% 15%; /* Dark red bg */
268
- --admin-error-dark: 0 100% 75%; /* Light red text */
269
- --admin-info: 199 89% 55%; /* Brighter blue */
270
- --admin-info-light: 199 89% 15%; /* Dark blue bg */
271
- --admin-info-dark: 199 89% 70%; /* Light blue text */
272
-
273
- /* Shadows - More visible in dark mode */
274
- --admin-shadow-sm: 0 2px 4px rgb(0 0 0 / 0.3);
275
- --admin-shadow-md: 0 4px 12px rgb(0 0 0 / 0.4);
276
- --admin-shadow-lg: 0 8px 24px rgb(0 0 0 / 0.5);
277
- --admin-shadow-xl: 0 16px 48px rgb(0 0 0 / 0.6);
278
-
279
- /* Standard variable mappings for dark mode */
280
- --background: var(--admin-background);
281
- --foreground: var(--admin-foreground);
282
- --card: var(--admin-card);
283
- --card-foreground: var(--admin-foreground);
284
- --popover: var(--admin-card);
285
- --popover-foreground: var(--admin-foreground);
286
- --primary: var(--admin-primary);
287
- --primary-foreground: var(--admin-primary-foreground);
288
- --secondary: var(--admin-background-subtle);
289
- --secondary-foreground: var(--admin-foreground);
290
- --muted: var(--admin-background-subtle);
291
- --muted-foreground: var(--admin-foreground-muted);
292
- --accent: var(--admin-primary-light);
293
- --accent-foreground: var(--admin-primary);
294
- --border: var(--admin-border);
295
- --input: var(--admin-border);
296
- --ring: var(--admin-primary);
297
- --destructive: var(--admin-error);
298
- --destructive-foreground: 0 0% 100%;
299
- }
300
- }
301
-
302
- /* Explicit dark mode class (for manual toggle) */
303
- .rovela-admin-theme.dark {
304
- /* Backgrounds - Dark blue-gray palette */
305
- --admin-background: 200 10% 10%;
306
- --admin-background-subtle: 200 10% 14%;
307
- --admin-card: 200 10% 14%;
308
- --admin-sidebar: 200 10% 12%; /* Slightly lighter than content bg */
309
- --admin-sidebar-hover: 200 10% 18%; /* Visible hover */
310
- --admin-sidebar-border: 200 10% 20%; /* Subtle border */
311
- --admin-sidebar-active: 163 86% 15%; /* Dark primary bg for active */
312
- --admin-sidebar-active-text: 163 86% 45%; /* Primary color text */
313
-
314
- /* Text Colors */
315
- --admin-foreground: 36 36% 95%;
316
- --admin-foreground-muted: 196 6% 60%;
317
- --admin-foreground-subtle: 196 6% 50%;
318
- --admin-sidebar-foreground: 200 10% 90%; /* Light text for dark sidebar */
319
- --admin-sidebar-foreground-muted: 200 10% 60%; /* Muted gray for inactive */
320
- --admin-sidebar-logo-filter: brightness(0) invert(1); /* White logo on dark sidebar */
321
-
322
- /* Primary */
323
- --admin-primary: 163 86% 45%;
324
- --admin-primary-hover: 163 86% 50%;
325
- --admin-primary-light: 163 86% 20%;
326
- --admin-primary-foreground: 200 10% 10%;
327
-
328
- /* Borders */
329
- --admin-border: 200 10% 20%;
330
- --admin-border-hover: 200 10% 25%;
331
- --admin-border-focus: 163 86% 45%;
332
-
333
- /* Status Colors */
334
- --admin-success: 168 100% 40%;
335
- --admin-success-light: 168 100% 15%;
336
- --admin-success-dark: 168 100% 60%;
337
- --admin-warning: 43 97% 50%;
338
- --admin-warning-light: 43 97% 15%;
339
- --admin-warning-dark: 43 97% 70%;
340
- --admin-error: 0 100% 65%;
341
- --admin-error-light: 0 100% 15%;
342
- --admin-error-dark: 0 100% 75%;
343
- --admin-info: 199 89% 55%;
344
- --admin-info-light: 199 89% 15%;
345
- --admin-info-dark: 199 89% 70%;
346
-
347
- /* Shadows */
348
- --admin-shadow-sm: 0 2px 4px rgb(0 0 0 / 0.3);
349
- --admin-shadow-md: 0 4px 12px rgb(0 0 0 / 0.4);
350
- --admin-shadow-lg: 0 8px 24px rgb(0 0 0 / 0.5);
351
- --admin-shadow-xl: 0 16px 48px rgb(0 0 0 / 0.6);
352
-
353
- /* Standard variable mappings */
354
- --background: var(--admin-background);
355
- --foreground: var(--admin-foreground);
356
- --card: var(--admin-card);
357
- --card-foreground: var(--admin-foreground);
358
- --popover: var(--admin-card);
359
- --popover-foreground: var(--admin-foreground);
360
- --primary: var(--admin-primary);
361
- --primary-foreground: var(--admin-primary-foreground);
362
- --secondary: var(--admin-background-subtle);
363
- --secondary-foreground: var(--admin-foreground);
364
- --muted: var(--admin-background-subtle);
365
- --muted-foreground: var(--admin-foreground-muted);
366
- --accent: var(--admin-primary-light);
367
- --accent-foreground: var(--admin-primary);
368
- --border: var(--admin-border);
369
- --input: var(--admin-border);
370
- --ring: var(--admin-primary);
371
- --destructive: var(--admin-error);
372
- --destructive-foreground: 0 0% 100%;
373
- }
374
-
375
- /* Dark mode when .dark class is on ancestor (next-themes pattern) */
376
- .dark .rovela-admin-theme {
377
- /* Backgrounds - Dark blue-gray palette */
378
- --admin-background: 200 10% 10%;
379
- --admin-background-subtle: 200 10% 14%;
380
- --admin-card: 200 10% 14%;
381
- --admin-sidebar: 200 10% 12%; /* Slightly lighter than content bg */
382
- --admin-sidebar-hover: 200 10% 18%; /* Visible hover */
383
- --admin-sidebar-border: 200 10% 20%; /* Subtle border */
384
- --admin-sidebar-active: 163 86% 15%; /* Dark primary bg for active */
385
- --admin-sidebar-active-text: 163 86% 45%; /* Primary color text */
386
-
387
- /* Text Colors */
388
- --admin-foreground: 36 36% 95%;
389
- --admin-foreground-muted: 196 6% 60%;
390
- --admin-foreground-subtle: 196 6% 50%;
391
- --admin-sidebar-foreground: 200 10% 90%; /* Light text for dark sidebar */
392
- --admin-sidebar-foreground-muted: 200 10% 60%; /* Muted gray for inactive */
393
- --admin-sidebar-logo-filter: brightness(0) invert(1); /* White logo on dark sidebar */
394
-
395
- /* Primary */
396
- --admin-primary: 163 86% 45%;
397
- --admin-primary-hover: 163 86% 50%;
398
- --admin-primary-light: 163 86% 20%;
399
- --admin-primary-foreground: 200 10% 10%;
400
-
401
- /* Borders */
402
- --admin-border: 200 10% 20%;
403
- --admin-border-hover: 200 10% 25%;
404
- --admin-border-focus: 163 86% 45%;
405
-
406
- /* Status Colors */
407
- --admin-success: 168 100% 40%;
408
- --admin-success-light: 168 100% 15%;
409
- --admin-success-dark: 168 100% 60%;
410
- --admin-warning: 43 97% 50%;
411
- --admin-warning-light: 43 97% 15%;
412
- --admin-warning-dark: 43 97% 70%;
413
- --admin-error: 0 100% 65%;
414
- --admin-error-light: 0 100% 15%;
415
- --admin-error-dark: 0 100% 75%;
416
- --admin-info: 199 89% 55%;
417
- --admin-info-light: 199 89% 15%;
418
- --admin-info-dark: 199 89% 70%;
419
-
420
- /* Shadows */
421
- --admin-shadow-sm: 0 2px 4px rgb(0 0 0 / 0.3);
422
- --admin-shadow-md: 0 4px 12px rgb(0 0 0 / 0.4);
423
- --admin-shadow-lg: 0 8px 24px rgb(0 0 0 / 0.5);
424
- --admin-shadow-xl: 0 16px 48px rgb(0 0 0 / 0.6);
425
-
426
- /* Standard variable mappings */
427
- --background: var(--admin-background);
428
- --foreground: var(--admin-foreground);
429
- --card: var(--admin-card);
430
- --card-foreground: var(--admin-foreground);
431
- --popover: var(--admin-card);
432
- --popover-foreground: var(--admin-foreground);
433
- --primary: var(--admin-primary);
434
- --primary-foreground: var(--admin-primary-foreground);
435
- --secondary: var(--admin-background-subtle);
436
- --secondary-foreground: var(--admin-foreground);
437
- --muted: var(--admin-background-subtle);
438
- --muted-foreground: var(--admin-foreground-muted);
439
- --accent: var(--admin-primary-light);
440
- --accent-foreground: var(--admin-primary);
441
- --border: var(--admin-border);
442
- --input: var(--admin-border);
443
- --ring: var(--admin-primary);
444
- --destructive: var(--admin-error);
445
- --destructive-foreground: 0 0% 100%;
446
- }
447
-
448
269
  /* ═══════════════════════════════════════════════════════════════════════════
449
270
  BASE STYLES
450
271
  ═══════════════════════════════════════════════════════════════════════════ */
@@ -465,6 +286,53 @@
465
286
  border-color: hsl(var(--admin-border));
466
287
  }
467
288
 
289
+ /* ═══════════════════════════════════════════════════════════════════════════
290
+ SCOPE FENCE — storefront-bleed isolation (2026-07 redesign, load-bearing)
291
+
292
+ The admin renders inside the merchant's own Next app: the storefront's
293
+ globals.css (brand fonts, `@layer base` heading sizes — often display
294
+ clamp() sizes of 56-96px) is in scope on /admin. Historically only
295
+ .admin-page-title / .admin-card-title neutralized this, so any BARE
296
+ heading inherited merchant typography (the documented giant-h1 bug class).
297
+
298
+ This fence pins every bare element to the admin system STRUCTURALLY:
299
+ selectors here are (0,1,1) — they beat the store's layered base rules AND
300
+ single-class Tailwind utilities regardless of load order, while any
301
+ .admin-* class (0,2,0) still wins over the fence. Bare headings are
302
+ deliberately modest (hierarchy through weight — the Polaris inversion);
303
+ pages that want the real page-title anatomy use .admin-page-title.
304
+ ═══════════════════════════════════════════════════════════════════════════ */
305
+
306
+ .rovela-admin-theme :is(h1, h2, h3, h4, h5, h6) {
307
+ font-family: var(--admin-font-sans);
308
+ color: hsl(var(--admin-foreground));
309
+ line-height: 1.35;
310
+ letter-spacing: var(--admin-tracking-normal);
311
+ }
312
+ .rovela-admin-theme h1 {
313
+ font-size: var(--admin-text-2xl); /* 20px */
314
+ font-weight: var(--admin-font-semibold);
315
+ letter-spacing: var(--admin-tracking-tight);
316
+ }
317
+ .rovela-admin-theme h2 {
318
+ font-size: var(--admin-text-lg); /* 15px */
319
+ font-weight: var(--admin-font-semibold);
320
+ }
321
+ .rovela-admin-theme h3 {
322
+ font-size: var(--admin-text-md); /* 14px */
323
+ font-weight: var(--admin-font-semibold);
324
+ }
325
+ .rovela-admin-theme :is(h4, h5, h6) {
326
+ font-size: var(--admin-text-base); /* 13px */
327
+ font-weight: var(--admin-font-semibold);
328
+ }
329
+ .rovela-admin-theme :is(p, span, li, td, th, dt, dd, label, a) {
330
+ font-family: var(--admin-font-sans);
331
+ }
332
+ .rovela-admin-theme :is(button, input, select, textarea) {
333
+ font-family: var(--admin-font-sans);
334
+ }
335
+
468
336
  /* ═══════════════════════════════════════════════════════════════════════════
469
337
  LAYOUT STRUCTURE
470
338
  ═══════════════════════════════════════════════════════════════════════════ */
@@ -531,7 +399,7 @@
531
399
 
532
400
  .rovela-admin-theme .admin-heading-1 {
533
401
  font-size: var(--admin-text-3xl);
534
- font-weight: var(--admin-font-bold);
402
+ font-weight: var(--admin-font-semibold);
535
403
  line-height: var(--admin-leading-tight);
536
404
  letter-spacing: var(--admin-tracking-tight);
537
405
  color: hsl(var(--admin-foreground));
@@ -554,8 +422,8 @@
554
422
  unlayered (like the rest of admin-theme.css), so it wins over the store's
555
423
  layered base heading regardless of the store's typography. */
556
424
  .rovela-admin-theme .admin-page-title {
557
- font-size: var(--admin-text-3xl);
558
- font-weight: var(--admin-font-bold);
425
+ font-size: var(--admin-text-3xl); /* 20px — the only large text */
426
+ font-weight: var(--admin-font-semibold);
559
427
  line-height: var(--admin-leading-tight);
560
428
  letter-spacing: var(--admin-tracking-tight);
561
429
  color: hsl(var(--admin-foreground));
@@ -586,7 +454,7 @@
586
454
  Without this rule, browsers render the bare <h3> at ~1.17em and the title
587
455
  reads oversized against the .admin-text-sm body. */
588
456
  .rovela-admin-theme .admin-card-title {
589
- font-size: var(--admin-text-lg);
457
+ font-size: var(--admin-text-md); /* 14px semibold — card headings */
590
458
  font-weight: var(--admin-font-semibold);
591
459
  line-height: var(--admin-leading-tight);
592
460
  color: hsl(var(--admin-foreground));
@@ -645,19 +513,21 @@
645
513
  border-color: hsl(var(--admin-border-hover));
646
514
  }
647
515
 
516
+ /* Card anatomy: 16px internal metrics everywhere (Polaris card spec) so
517
+ sibling cards share a baseline grid. */
648
518
  .rovela-admin-theme .admin-card-header {
649
- padding: var(--admin-space-5) var(--admin-space-6);
650
- border-bottom: var(--admin-border-width) solid hsl(var(--admin-border));
519
+ padding: var(--admin-space-4);
520
+ border-bottom: var(--admin-border-width) solid hsl(var(--admin-border) / 0.6);
651
521
  }
652
522
 
653
523
  .rovela-admin-theme .admin-card-body {
654
- padding: var(--admin-space-6);
524
+ padding: var(--admin-space-4);
655
525
  }
656
526
 
657
527
  .rovela-admin-theme .admin-card-footer {
658
- padding: var(--admin-space-4) var(--admin-space-6);
659
- border-top: var(--admin-border-width) solid hsl(var(--admin-border));
660
- background: hsl(var(--admin-background-subtle) / 0.5);
528
+ padding: var(--admin-space-3) var(--admin-space-4);
529
+ border-top: var(--admin-border-width) solid hsl(var(--admin-border) / 0.6);
530
+ background: hsl(var(--admin-background-subtle) / 0.35);
661
531
  }
662
532
 
663
533
  /* ═══════════════════════════════════════════════════════════════════════════
@@ -667,7 +537,7 @@
667
537
  .rovela-admin-theme .admin-input {
668
538
  display: flex;
669
539
  width: 100%;
670
- height: 2.5rem; /* 40px */
540
+ height: 2.25rem; /* 36px — form-context control height */
671
541
  padding: 0 var(--admin-space-3);
672
542
  font-family: var(--admin-font-sans);
673
543
  font-size: var(--admin-text-base);
@@ -786,13 +656,18 @@
786
656
  BUTTON COMPONENTS
787
657
  ═══════════════════════════════════════════════════════════════════════════ */
788
658
 
659
+ /* Buttons — the premium press model (2026-07 redesign): NO glows, NO upward
660
+ hover lift (both read as template flair). Feedback is a decisive shade
661
+ change on hover, a 0.5px downward press + darker shade on :active (the
662
+ button physically responds under the cursor), and a soft accent ring on
663
+ keyboard focus. One primary per view. */
789
664
  .rovela-admin-theme .admin-btn {
790
665
  display: inline-flex;
791
666
  align-items: center;
792
667
  justify-content: center;
793
668
  gap: var(--admin-space-2);
794
- height: 2.5rem;
795
- padding: 0 var(--admin-space-4);
669
+ height: 2.25rem; /* 36px form-context (was 40) */
670
+ padding: 0 var(--admin-space-3-5);
796
671
  font-family: var(--admin-font-sans);
797
672
  font-size: var(--admin-text-base);
798
673
  font-weight: var(--admin-font-medium);
@@ -810,73 +685,75 @@
810
685
  cursor: not-allowed;
811
686
  }
812
687
 
688
+ .rovela-admin-theme .admin-btn:active:not(:disabled) {
689
+ transform: translateY(0.5px);
690
+ }
691
+
813
692
  .rovela-admin-theme .admin-btn:focus-visible {
814
- outline: 2px solid hsl(var(--admin-primary));
815
- outline-offset: 2px;
693
+ outline: none;
694
+ box-shadow: 0 0 0 3px hsl(var(--admin-primary) / 0.25);
816
695
  }
817
696
 
818
- /* Primary Button - Enhanced with Rovela glow */
697
+ /* Primary Button */
819
698
  .rovela-admin-theme .admin-btn-primary {
820
699
  background: hsl(var(--admin-primary));
821
700
  color: hsl(var(--admin-primary-foreground));
822
- box-shadow: 0 1px 3px 0 hsl(var(--admin-primary) / 0.2);
701
+ box-shadow: var(--admin-shadow-xs);
823
702
  }
824
703
 
825
704
  .rovela-admin-theme .admin-btn-primary:hover:not(:disabled) {
826
705
  background: hsl(var(--admin-primary-hover));
827
- box-shadow: 0 0 20px hsl(var(--admin-primary) / 0.4), 0 4px 12px hsl(var(--admin-primary) / 0.25);
828
- transform: translateY(-1px);
829
706
  }
830
707
 
831
708
  .rovela-admin-theme .admin-btn-primary:active:not(:disabled) {
832
- background: hsl(var(--admin-primary-hover));
833
- box-shadow: 0 0 10px hsl(var(--admin-primary) / 0.3);
834
- transform: translateY(0);
709
+ background: hsl(var(--admin-primary-active));
835
710
  }
836
711
 
837
- /* Secondary Button */
712
+ /* Secondary Button — white + hairline */
838
713
  .rovela-admin-theme .admin-btn-secondary {
839
714
  background: hsl(var(--admin-card));
840
715
  color: hsl(var(--admin-foreground));
841
716
  border-color: hsl(var(--admin-border));
717
+ box-shadow: var(--admin-shadow-xs);
842
718
  }
843
719
 
844
720
  .rovela-admin-theme .admin-btn-secondary:hover:not(:disabled) {
845
- background: hsl(var(--admin-background-subtle));
721
+ background: hsl(36 30% 98%);
846
722
  border-color: hsl(var(--admin-border-hover));
847
723
  }
848
724
 
849
725
  .rovela-admin-theme .admin-btn-secondary:active:not(:disabled) {
850
- background: hsl(var(--admin-background-subtle));
851
- box-shadow: var(--admin-shadow-inner);
726
+ background: hsl(var(--admin-background-subtle) / 0.6);
852
727
  }
853
728
 
854
729
  /* Ghost Button */
855
730
  .rovela-admin-theme .admin-btn-ghost {
856
731
  background: transparent;
857
- color: hsl(var(--admin-foreground));
732
+ color: hsl(var(--admin-foreground-muted));
858
733
  }
859
734
 
860
735
  .rovela-admin-theme .admin-btn-ghost:hover:not(:disabled) {
861
- background: hsl(var(--admin-background-subtle));
736
+ background: hsl(var(--admin-foreground) / 0.05);
737
+ color: hsl(var(--admin-foreground));
862
738
  }
863
739
 
864
- /* Destructive Button - Enhanced with glow */
740
+ /* Destructive Button solid error surface */
865
741
  .rovela-admin-theme .admin-btn-destructive {
866
742
  background: hsl(var(--admin-error));
867
- color: white;
868
- box-shadow: 0 1px 3px 0 hsl(var(--admin-error) / 0.2);
743
+ color: hsl(var(--admin-error-foreground));
744
+ box-shadow: var(--admin-shadow-xs);
869
745
  }
870
746
 
871
747
  .rovela-admin-theme .admin-btn-destructive:hover:not(:disabled) {
872
748
  background: hsl(var(--admin-error-dark));
873
- box-shadow: 0 0 20px hsl(var(--admin-error) / 0.4), 0 4px 12px hsl(var(--admin-error) / 0.25);
874
- transform: translateY(-1px);
875
749
  }
876
750
 
877
751
  .rovela-admin-theme .admin-btn-destructive:active:not(:disabled) {
878
- box-shadow: 0 0 10px hsl(var(--admin-error) / 0.3);
879
- transform: translateY(0);
752
+ background: hsl(var(--admin-error-dark));
753
+ }
754
+
755
+ .rovela-admin-theme .admin-btn-destructive:focus-visible {
756
+ box-shadow: 0 0 0 3px hsl(var(--admin-error) / 0.3);
880
757
  }
881
758
 
882
759
  /* Button Sizes */
@@ -906,6 +783,9 @@
906
783
  BADGE COMPONENTS
907
784
  ═══════════════════════════════════════════════════════════════════════════ */
908
785
 
786
+ /* Badges — six tones, ONE recipe (tinted bg + darker fg), 6px radius (a
787
+ soft rectangle, not a pill — pills at 12px read as noise in dense tables),
788
+ past-tense ≤2-word labels. The same status is the same color everywhere. */
909
789
  .rovela-admin-theme .admin-badge {
910
790
  display: inline-flex;
911
791
  align-items: center;
@@ -914,10 +794,15 @@
914
794
  font-size: var(--admin-text-xs);
915
795
  font-weight: var(--admin-font-medium);
916
796
  line-height: var(--admin-leading-normal);
917
- border-radius: var(--admin-radius-full);
797
+ border-radius: var(--admin-radius-sm);
918
798
  white-space: nowrap;
919
799
  }
920
800
 
801
+ .rovela-admin-theme .admin-badge-attention {
802
+ background: hsl(var(--admin-attention-light));
803
+ color: hsl(var(--admin-attention-dark));
804
+ }
805
+
921
806
  .rovela-admin-theme .admin-badge-success {
922
807
  background: hsl(var(--admin-success-light));
923
808
  color: hsl(var(--admin-success-dark));
@@ -1042,28 +927,31 @@
1042
927
  background: hsl(var(--admin-card));
1043
928
  }
1044
929
 
930
+ /* Index-table anatomy (2026-07 redesign): 13px cells with tabular numerals,
931
+ ~38px rows (8px vertical padding), 1px hairline separators — never zebra —
932
+ quiet row hover, sentence-case 12px header labels (uppercase shouting was
933
+ the old look; weight + color carry the hierarchy now). */
1045
934
  .rovela-admin-theme .admin-table {
1046
935
  width: 100%;
1047
936
  border-collapse: collapse;
1048
937
  font-size: var(--admin-text-base);
938
+ font-variant-numeric: tabular-nums;
1049
939
  }
1050
940
 
1051
941
  .rovela-admin-theme .admin-table th {
1052
- padding: var(--admin-space-3) var(--admin-space-4);
942
+ padding: var(--admin-space-2-5) var(--admin-space-4);
1053
943
  font-size: var(--admin-text-xs);
1054
944
  font-weight: var(--admin-font-semibold);
1055
- text-transform: uppercase;
1056
- letter-spacing: var(--admin-tracking-wide);
1057
945
  color: hsl(var(--admin-foreground-muted));
1058
946
  background: transparent;
1059
947
  text-align: left;
1060
- border-bottom: 2px solid hsl(var(--admin-border));
948
+ border-bottom: var(--admin-border-width) solid hsl(var(--admin-border));
1061
949
  }
1062
950
 
1063
951
  .rovela-admin-theme .admin-table td {
1064
- padding: var(--admin-space-4);
952
+ padding: var(--admin-space-2) var(--admin-space-4);
1065
953
  color: hsl(var(--admin-foreground));
1066
- border-bottom: var(--admin-border-width) solid hsl(var(--admin-border));
954
+ border-bottom: var(--admin-border-width) solid hsl(var(--admin-border) / 0.6);
1067
955
  vertical-align: middle;
1068
956
  }
1069
957
 
@@ -1072,11 +960,11 @@
1072
960
  }
1073
961
 
1074
962
  .rovela-admin-theme .admin-table tbody tr {
1075
- transition: var(--admin-transition-colors);
963
+ transition: background-color 100ms var(--admin-ease);
1076
964
  }
1077
965
 
1078
966
  .rovela-admin-theme .admin-table tbody tr:hover {
1079
- background: hsl(var(--admin-background-subtle) / 0.5);
967
+ background: hsl(36 30% 97.5%);
1080
968
  }
1081
969
 
1082
970
  .rovela-admin-theme .admin-table-empty {
@@ -1089,13 +977,18 @@
1089
977
  SIDEBAR COMPONENTS
1090
978
  ═══════════════════════════════════════════════════════════════════════════ */
1091
979
 
980
+ /* Sidebar (2026-07 redesign): 240px light surface, 32px rows, 18px icons,
981
+ tinted-emerald active state (one of the few sanctioned accent uses),
982
+ uppercase 11px eyebrow group labels. Labels always visible — no icon rail
983
+ for a merchant audience. */
1092
984
  .rovela-admin-theme .admin-sidebar {
1093
985
  display: flex;
1094
986
  flex-direction: column;
1095
- width: 16rem;
987
+ width: 15rem; /* 240px (was 256) */
1096
988
  min-height: 100vh;
1097
989
  background: hsl(var(--admin-sidebar));
1098
990
  color: hsl(var(--admin-sidebar-foreground));
991
+ border-right: var(--admin-border-width) solid hsl(var(--admin-sidebar-border));
1099
992
  flex-shrink: 0;
1100
993
  }
1101
994
 
@@ -1190,28 +1083,27 @@
1190
1083
  }
1191
1084
 
1192
1085
  .rovela-admin-theme .admin-sidebar-section-title {
1193
- /* Tightened from 8/16px 4/8px vertical, saves 12px per section heading
1194
- across the four groups (Main / Catalog / Sales + the optional Features). */
1195
- padding: var(--admin-space-1) var(--admin-space-3);
1196
- padding-top: var(--admin-space-2);
1197
- font-size: var(--admin-text-xs);
1198
- font-weight: var(--admin-font-medium);
1199
- text-transform: none;
1200
- letter-spacing: var(--admin-tracking-normal);
1201
- color: hsl(var(--admin-sidebar-foreground-muted) / 0.7);
1086
+ /* Eyebrow group label the platform's signature uppercase-tracked micro
1087
+ type. Encodes grouping structurally instead of extra whitespace. */
1088
+ padding: var(--admin-space-1) var(--admin-space-2-5);
1089
+ padding-top: var(--admin-space-3);
1090
+ font-size: var(--admin-text-2xs);
1091
+ font-weight: var(--admin-font-semibold);
1092
+ text-transform: uppercase;
1093
+ letter-spacing: var(--admin-tracking-wide);
1094
+ color: hsl(var(--admin-sidebar-foreground-muted) / 0.75);
1202
1095
  }
1203
1096
 
1204
1097
  .rovela-admin-theme .admin-sidebar-item {
1205
1098
  display: flex;
1206
1099
  align-items: center;
1207
- gap: var(--admin-space-3);
1208
- /* Tightened from space-2-5 (10px) space-1-5 (6px) vertical, saves ~8px
1209
- per row across 12 rows (~96px). Tap target stays at ~36px (icon 20px +
1210
- padding 12px + leading) — well above the 32px admin standard. */
1211
- padding: var(--admin-space-1-5) var(--admin-space-3);
1100
+ gap: var(--admin-space-2-5);
1101
+ /* 32px row: 13px/500 label + 18px icon + 7px vertical padding. */
1102
+ padding: 0.4375rem var(--admin-space-2-5);
1212
1103
  font-size: var(--admin-text-sm);
1104
+ font-weight: var(--admin-font-medium);
1213
1105
  color: hsl(var(--admin-sidebar-foreground-muted));
1214
- border-radius: var(--admin-radius-md);
1106
+ border-radius: var(--admin-radius-sm);
1215
1107
  transition: var(--admin-transition-colors);
1216
1108
  cursor: pointer;
1217
1109
  text-decoration: none;
@@ -1219,14 +1111,23 @@
1219
1111
  }
1220
1112
 
1221
1113
  .rovela-admin-theme .admin-sidebar-item:hover {
1222
- background: hsl(var(--admin-sidebar-hover));
1114
+ background: hsl(var(--admin-foreground) / 0.04);
1223
1115
  color: hsl(var(--admin-sidebar-foreground));
1224
1116
  }
1225
1117
 
1118
+ .rovela-admin-theme .admin-sidebar-item:active {
1119
+ background: hsl(var(--admin-foreground) / 0.07);
1120
+ }
1121
+
1122
+ .rovela-admin-theme .admin-sidebar-item:focus-visible {
1123
+ outline: none;
1124
+ box-shadow: inset 0 0 0 2px hsl(var(--admin-primary) / 0.35);
1125
+ }
1126
+
1226
1127
  .rovela-admin-theme .admin-sidebar-item.active {
1227
1128
  background: hsl(var(--admin-sidebar-active));
1228
1129
  color: hsl(var(--admin-sidebar-active-text));
1229
- font-weight: var(--admin-font-medium);
1130
+ font-weight: var(--admin-font-semibold);
1230
1131
  }
1231
1132
 
1232
1133
  .rovela-admin-theme .admin-sidebar-item.active .admin-sidebar-item-icon {
@@ -1234,16 +1135,16 @@
1234
1135
  }
1235
1136
 
1236
1137
  .rovela-admin-theme .admin-sidebar-item-icon {
1237
- width: 1.25rem;
1238
- height: 1.25rem;
1138
+ width: 1.125rem;
1139
+ height: 1.125rem;
1239
1140
  flex-shrink: 0;
1240
1141
  }
1241
1142
 
1242
1143
  /* Sidebar item icon (svg) - ensure consistent sizing */
1243
1144
  .rovela-admin-theme .admin-sidebar-item svg,
1244
1145
  .rovela-admin-theme .admin-sidebar-item-svg {
1245
- width: 1.25rem;
1246
- height: 1.25rem;
1146
+ width: 1.125rem;
1147
+ height: 1.125rem;
1247
1148
  flex-shrink: 0;
1248
1149
  }
1249
1150
 
@@ -1271,18 +1172,24 @@
1271
1172
  gap: var(--admin-space-1-5);
1272
1173
  }
1273
1174
 
1175
+ /* Footer links behave like nav rows (hover surface, radius) — consistent
1176
+ interaction grammar top to bottom of the sidebar. */
1274
1177
  .rovela-admin-theme .admin-sidebar-footer-link {
1275
1178
  display: flex;
1276
1179
  align-items: center;
1277
- gap: var(--admin-space-2);
1180
+ gap: var(--admin-space-2-5);
1181
+ padding: 0.375rem var(--admin-space-2-5);
1278
1182
  font-size: var(--admin-text-sm);
1279
- color: hsl(var(--admin-sidebar-foreground-muted) / 0.6);
1183
+ font-weight: var(--admin-font-medium);
1184
+ border-radius: var(--admin-radius-sm);
1185
+ color: hsl(var(--admin-sidebar-foreground-muted));
1280
1186
  text-decoration: none;
1281
1187
  transition: var(--admin-transition-colors);
1282
1188
  }
1283
1189
 
1284
1190
  .rovela-admin-theme .admin-sidebar-footer-link:hover {
1285
- color: hsl(var(--admin-sidebar-foreground-muted));
1191
+ background: hsl(var(--admin-foreground) / 0.04);
1192
+ color: hsl(var(--admin-sidebar-foreground));
1286
1193
  }
1287
1194
 
1288
1195
  /* Powered by Rovela link */
@@ -2017,10 +1924,13 @@
2017
1924
  min-width: 0;
2018
1925
  }
2019
1926
 
1927
+ /* Stat/KPI card — the calm band (2026-07 redesign): 11px uppercase label,
1928
+ 20px tabular value, no gradient washes (functional surfaces stay flat),
1929
+ hover only hints when the card links somewhere. */
2020
1930
  .rovela-admin-theme .admin-stat-card {
2021
1931
  display: block;
2022
1932
  position: relative;
2023
- padding: var(--admin-space-6);
1933
+ padding: var(--admin-space-4);
2024
1934
  background: hsl(var(--admin-card));
2025
1935
  border: var(--admin-border-width) solid hsl(var(--admin-border));
2026
1936
  border-radius: var(--admin-radius-lg);
@@ -2035,46 +1945,37 @@
2035
1945
  border-color: hsl(var(--admin-border-hover));
2036
1946
  }
2037
1947
 
2038
- .rovela-admin-theme .admin-stat-card::before {
2039
- content: '';
2040
- position: absolute;
2041
- inset: 0;
2042
- background: linear-gradient(135deg, hsl(var(--admin-primary) / 0.03) 0%, transparent 60%);
2043
- opacity: 0;
2044
- transition: var(--admin-transition-opacity);
2045
- pointer-events: none;
2046
- }
2047
-
2048
- .rovela-admin-theme .admin-stat-card:hover::before {
2049
- opacity: 1;
2050
- }
2051
-
2052
1948
  .rovela-admin-theme .admin-stat-icon {
2053
1949
  display: flex;
2054
1950
  align-items: center;
2055
1951
  justify-content: center;
2056
1952
  flex-shrink: 0;
2057
- width: 2.75rem;
2058
- height: 2.75rem;
2059
- background: hsl(var(--admin-primary-light));
2060
- color: hsl(var(--admin-primary));
2061
- border-radius: var(--admin-radius-lg);
1953
+ width: 2.25rem;
1954
+ height: 2.25rem;
1955
+ background: hsl(var(--admin-primary) / 0.08);
1956
+ color: hsl(var(--admin-accent-deep));
1957
+ border-radius: var(--admin-radius-sm);
2062
1958
  }
2063
1959
 
2064
1960
  .rovela-admin-theme .admin-stat-icon svg {
2065
- width: 1.5rem;
2066
- height: 1.5rem;
1961
+ width: 1.125rem;
1962
+ height: 1.125rem;
2067
1963
  }
2068
1964
 
2069
1965
  .rovela-admin-theme .admin-stat-value {
2070
1966
  font-size: var(--admin-text-2xl);
2071
- font-weight: var(--admin-font-bold);
1967
+ font-weight: var(--admin-font-semibold);
1968
+ letter-spacing: var(--admin-tracking-tight);
1969
+ font-variant-numeric: tabular-nums;
2072
1970
  color: hsl(var(--admin-foreground));
2073
1971
  line-height: 1.2;
2074
1972
  }
2075
1973
 
2076
1974
  .rovela-admin-theme .admin-stat-label {
2077
- font-size: var(--admin-text-sm);
1975
+ font-size: var(--admin-text-2xs);
1976
+ font-weight: var(--admin-font-semibold);
1977
+ text-transform: uppercase;
1978
+ letter-spacing: var(--admin-tracking-wide);
2078
1979
  color: hsl(var(--admin-foreground-muted));
2079
1980
  }
2080
1981
 
@@ -2273,21 +2174,11 @@
2273
2174
  }
2274
2175
 
2275
2176
  /* Active indicator bar for nav items */
2177
+ /* Left indicator bar RETIRED (2026-07 redesign): the tinted active surface
2178
+ carries the state on its own; bar + tint was double signaling. Rule kept
2179
+ (display:none) because AdminNav still renders the element. */
2276
2180
  .rovela-admin-theme .admin-sidebar-indicator {
2277
- position: absolute;
2278
- left: 0;
2279
- top: 50%;
2280
- transform: translateY(-50%);
2281
- height: 1.5rem;
2282
- width: 3px;
2283
- border-radius: 0 var(--admin-radius-full) var(--admin-radius-full) 0;
2284
- background: hsl(var(--admin-sidebar-active-text));
2285
- opacity: 0;
2286
- transition: opacity 0.2s var(--admin-ease-rovela);
2287
- }
2288
-
2289
- .rovela-admin-theme .admin-sidebar-item.active .admin-sidebar-indicator {
2290
- opacity: 1;
2181
+ display: none;
2291
2182
  }
2292
2183
 
2293
2184
  /* View store link button */
@@ -2444,28 +2335,28 @@
2444
2335
 
2445
2336
  /* Status-specific badge variants for orders */
2446
2337
  .rovela-admin-theme .admin-badge-pending {
2447
- background: hsl(var(--admin-warning) / 0.1);
2448
- color: hsl(var(--admin-warning));
2338
+ background: hsl(var(--admin-warning-light));
2339
+ color: hsl(var(--admin-warning-dark));
2449
2340
  }
2450
2341
 
2451
2342
  .rovela-admin-theme .admin-badge-paid {
2452
- background: hsl(var(--admin-success) / 0.1);
2453
- color: hsl(var(--admin-success));
2343
+ background: hsl(var(--admin-success-light));
2344
+ color: hsl(var(--admin-success-dark));
2454
2345
  }
2455
2346
 
2456
2347
  .rovela-admin-theme .admin-badge-shipped {
2457
- background: hsl(var(--admin-info) / 0.1);
2458
- color: hsl(var(--admin-info));
2348
+ background: hsl(var(--admin-info-light));
2349
+ color: hsl(var(--admin-info-dark));
2459
2350
  }
2460
2351
 
2461
2352
  .rovela-admin-theme .admin-badge-delivered {
2462
- background: hsl(var(--admin-primary) / 0.1);
2463
- color: hsl(var(--admin-primary));
2353
+ background: hsl(var(--admin-success-light));
2354
+ color: hsl(var(--admin-success-dark));
2464
2355
  }
2465
2356
 
2466
2357
  .rovela-admin-theme .admin-badge-cancelled {
2467
- background: hsl(var(--admin-error) / 0.1);
2468
- color: hsl(var(--admin-error));
2358
+ background: hsl(var(--admin-error-light));
2359
+ color: hsl(var(--admin-error-dark));
2469
2360
  }
2470
2361
 
2471
2362
  .rovela-admin-theme .admin-badge-refunded {
@@ -2475,13 +2366,13 @@
2475
2366
 
2476
2367
  /* Out of stock variant */
2477
2368
  .rovela-admin-theme .admin-badge-out-of-stock {
2478
- background: hsl(var(--admin-error) / 0.1);
2479
- color: hsl(var(--admin-error));
2369
+ background: hsl(var(--admin-error-light));
2370
+ color: hsl(var(--admin-error-dark));
2480
2371
  }
2481
2372
 
2482
2373
  .rovela-admin-theme .admin-badge-low-stock {
2483
- background: hsl(var(--admin-warning) / 0.1);
2484
- color: hsl(var(--admin-warning));
2374
+ background: hsl(var(--admin-warning-light));
2375
+ color: hsl(var(--admin-warning-dark));
2485
2376
  }
2486
2377
 
2487
2378
  /* ═══════════════════════════════════════════════════════════════════════════
@@ -2502,14 +2393,45 @@
2502
2393
  border-bottom: none;
2503
2394
  }
2504
2395
 
2505
- /* Link within table row - changes color on row hover */
2396
+ /* Row identifier link (order numbers etc.) monospace INK, not accent
2397
+ (premium pass: accent scarcity — 15 emerald IDs per screen shouted). The
2398
+ accent appears only on hover, signaling the action without spraying color. */
2506
2399
  .rovela-admin-theme .admin-table-row-link {
2507
- color: hsl(var(--admin-primary));
2400
+ font-family: var(--admin-font-mono);
2401
+ font-size: var(--admin-text-xs);
2402
+ letter-spacing: -0.01em;
2403
+ color: hsl(var(--admin-foreground));
2508
2404
  font-weight: var(--admin-font-medium);
2509
2405
  text-decoration: none;
2406
+ background: none;
2407
+ border: none;
2408
+ padding: 0;
2409
+ cursor: pointer;
2510
2410
  transition: var(--admin-transition-colors);
2511
2411
  }
2512
2412
 
2413
+ .rovela-admin-theme .admin-table-row-link:hover {
2414
+ color: hsl(var(--admin-accent-deep));
2415
+ }
2416
+
2417
+ /* In-table selects go QUIET (premium pass): a full-bordered 36px control per
2418
+ row dominates a dense table. Ghost until hover — systemic, covers every
2419
+ table's row-level AdminSelect. */
2420
+ .rovela-admin-theme td .admin-select-trigger {
2421
+ height: 1.75rem;
2422
+ border-color: transparent;
2423
+ background: transparent;
2424
+ color: hsl(var(--admin-foreground-muted));
2425
+ font-size: var(--admin-text-xs);
2426
+ box-shadow: none;
2427
+ }
2428
+
2429
+ .rovela-admin-theme td .admin-select-trigger:hover {
2430
+ border-color: hsl(var(--admin-border));
2431
+ background: hsl(var(--admin-card));
2432
+ color: hsl(var(--admin-foreground));
2433
+ }
2434
+
2513
2435
  /* ═══════════════════════════════════════════════════════════════════════════
2514
2436
  SKELETON LOADERS
2515
2437
  ═══════════════════════════════════════════════════════════════════════════ */
@@ -2583,17 +2505,18 @@
2583
2505
  TABLE HEADER STYLES
2584
2506
  ═══════════════════════════════════════════════════════════════════════════ */
2585
2507
 
2508
+ /* Duplicate of .admin-table th kept for the components that target
2509
+ .admin-table-header directly — values MUST stay in lockstep with the
2510
+ canonical table header above. */
2586
2511
  .rovela-admin-theme .admin-table-header {
2587
2512
  background: transparent;
2588
- border-bottom: 2px solid hsl(var(--admin-border));
2513
+ border-bottom: var(--admin-border-width) solid hsl(var(--admin-border));
2589
2514
  }
2590
2515
 
2591
2516
  .rovela-admin-theme .admin-table-header th {
2592
- padding: var(--admin-space-3) var(--admin-space-4);
2517
+ padding: var(--admin-space-2-5) var(--admin-space-4);
2593
2518
  font-size: var(--admin-text-xs);
2594
2519
  font-weight: var(--admin-font-semibold);
2595
- text-transform: uppercase;
2596
- letter-spacing: var(--admin-tracking-wide);
2597
2520
  color: hsl(var(--admin-foreground-muted));
2598
2521
  text-align: left;
2599
2522
  background: transparent;
@@ -2655,13 +2578,13 @@
2655
2578
  }
2656
2579
 
2657
2580
  .rovela-admin-theme .admin-badge-active {
2658
- background: hsl(var(--admin-success) / 0.1);
2659
- color: hsl(var(--admin-success));
2581
+ background: hsl(var(--admin-success-light));
2582
+ color: hsl(var(--admin-success-dark));
2660
2583
  }
2661
2584
 
2662
2585
  .rovela-admin-theme .admin-badge-archived {
2663
- background: hsl(var(--admin-error) / 0.1);
2664
- color: hsl(var(--admin-error));
2586
+ background: hsl(var(--admin-error-light));
2587
+ color: hsl(var(--admin-error-dark));
2665
2588
  }
2666
2589
 
2667
2590
  /* ═══════════════════════════════════════════════════════════════════════════
@@ -2669,13 +2592,13 @@
2669
2592
  ═══════════════════════════════════════════════════════════════════════════ */
2670
2593
 
2671
2594
  .rovela-admin-theme .admin-badge-verified {
2672
- background: hsl(var(--admin-success) / 0.1);
2673
- color: hsl(var(--admin-success));
2595
+ background: hsl(var(--admin-success-light));
2596
+ color: hsl(var(--admin-success-dark));
2674
2597
  }
2675
2598
 
2676
2599
  .rovela-admin-theme .admin-badge-unverified {
2677
- background: hsl(var(--admin-warning) / 0.1);
2678
- color: hsl(var(--admin-warning));
2600
+ background: hsl(var(--admin-warning-light));
2601
+ color: hsl(var(--admin-warning-dark));
2679
2602
  }
2680
2603
 
2681
2604
  /* ═══════════════════════════════════════════════════════════════════════════
@@ -3500,16 +3423,18 @@
3500
3423
  cursor: not-allowed;
3501
3424
  }
3502
3425
 
3426
+ /* Active chip: solid emerald (the ops-console + platform pill grammar) —
3427
+ unambiguous selected state, no squinting at outline tints. */
3503
3428
  .rovela-admin-theme .admin-chip-active {
3504
3429
  border-color: hsl(var(--admin-primary));
3505
- color: hsl(var(--admin-primary));
3506
- background: hsl(var(--admin-primary) / 0.08);
3430
+ color: hsl(var(--admin-primary-foreground));
3431
+ background: hsl(var(--admin-primary));
3507
3432
  }
3508
3433
 
3509
3434
  .rovela-admin-theme .admin-chip-active:hover:not(:disabled) {
3510
- border-color: hsl(var(--admin-primary));
3511
- background: hsl(var(--admin-primary) / 0.12);
3512
- color: hsl(var(--admin-primary));
3435
+ border-color: hsl(var(--admin-primary-hover));
3436
+ background: hsl(var(--admin-primary-hover));
3437
+ color: hsl(var(--admin-primary-foreground));
3513
3438
  }
3514
3439
 
3515
3440
  /* Bulk action bar — replaces the filter row when one or more rows are
@@ -3658,15 +3583,17 @@
3658
3583
  color: hsl(var(--admin-foreground-muted));
3659
3584
  }
3660
3585
 
3661
- /* Danger button (used for the bulk Delete action) */
3586
+ /* Danger button ALIAS of .admin-btn-destructive (it was a redundant near
3587
+ duplicate; values must stay in lockstep with the destructive button). */
3662
3588
  .rovela-admin-theme .admin-btn-danger {
3663
3589
  background: hsl(var(--admin-error));
3664
- color: hsl(var(--admin-error-foreground, 0 0% 100%));
3665
- border: 1px solid hsl(var(--admin-error));
3590
+ color: hsl(var(--admin-error-foreground));
3591
+ border: 1px solid transparent;
3592
+ box-shadow: var(--admin-shadow-xs);
3666
3593
  }
3667
3594
 
3668
3595
  .rovela-admin-theme .admin-btn-danger:hover:not(:disabled) {
3669
- background: hsl(var(--admin-error) / 0.9);
3596
+ background: hsl(var(--admin-error-dark));
3670
3597
  }
3671
3598
 
3672
3599
  .rovela-admin-theme .admin-btn-danger:disabled {
@@ -4245,3 +4172,206 @@
4245
4172
  .rovela-admin-theme .admin-datepicker-action.is-primary {
4246
4173
  color: hsl(var(--admin-primary));
4247
4174
  }
4175
+
4176
+ /* ═══════════════════════════════════════════════════════════════════════════
4177
+ PAGE HEADER BAND — the Rovela identity zone (2026-07 premium pass)
4178
+
4179
+ The platform's signature (/ops, /developers): an accent-washed gradient
4180
+ band with an uppercase eyebrow and the 20px title, hairline bottom. Full
4181
+ bleed against the sidebar via negative margins that cancel the content
4182
+ padding. Every admin page opens with this — it is what makes the admin
4183
+ read as Rovela at a glance.
4184
+ ═══════════════════════════════════════════════════════════════════════════ */
4185
+
4186
+ .rovela-admin-theme .admin-page-header {
4187
+ display: flex;
4188
+ align-items: flex-end;
4189
+ justify-content: space-between;
4190
+ flex-wrap: wrap;
4191
+ gap: var(--admin-space-4);
4192
+ margin: calc(var(--admin-space-6) * -1) calc(var(--admin-space-6) * -1) var(--admin-space-6);
4193
+ padding: var(--admin-space-6) var(--admin-space-6) var(--admin-space-5);
4194
+ background: linear-gradient(to bottom, hsl(var(--admin-accent) / 0.055), transparent);
4195
+ border-bottom: var(--admin-border-width) solid hsl(var(--admin-border) / 0.7);
4196
+ }
4197
+
4198
+ .rovela-admin-theme .admin-page-header-eyebrow {
4199
+ font-size: var(--admin-text-2xs);
4200
+ font-weight: var(--admin-font-semibold);
4201
+ text-transform: uppercase;
4202
+ letter-spacing: 0.14em;
4203
+ color: hsl(var(--admin-accent-deep));
4204
+ margin-bottom: var(--admin-space-1);
4205
+ }
4206
+
4207
+ .rovela-admin-theme .admin-page-header-sub {
4208
+ font-size: var(--admin-text-xs);
4209
+ color: hsl(var(--admin-foreground-muted));
4210
+ margin-top: var(--admin-space-1);
4211
+ }
4212
+
4213
+ .rovela-admin-theme .admin-page-header-actions {
4214
+ display: flex;
4215
+ align-items: center;
4216
+ flex-wrap: wrap;
4217
+ gap: var(--admin-space-2);
4218
+ }
4219
+
4220
+ /* Narrow content column for settings/detail pages (tables stay full width). */
4221
+ .rovela-admin-theme .admin-content-narrow {
4222
+ max-width: 60rem;
4223
+ margin-left: auto;
4224
+ margin-right: auto;
4225
+ }
4226
+
4227
+ /* ── Delta chips — the KPI band's tinted pills (replaces colored plain text) */
4228
+ .rovela-admin-theme .admin-delta {
4229
+ display: inline-flex;
4230
+ align-items: center;
4231
+ gap: 2px;
4232
+ padding: 1px var(--admin-space-1-5);
4233
+ border-radius: var(--admin-radius-full);
4234
+ font-size: var(--admin-text-2xs);
4235
+ font-weight: var(--admin-font-semibold);
4236
+ font-variant-numeric: tabular-nums;
4237
+ line-height: 1.5;
4238
+ white-space: nowrap;
4239
+ }
4240
+ .rovela-admin-theme .admin-delta svg { width: 0.75rem; height: 0.75rem; }
4241
+ .rovela-admin-theme .admin-delta-good {
4242
+ background: hsl(var(--admin-success-light));
4243
+ color: hsl(var(--admin-success-dark));
4244
+ }
4245
+ .rovela-admin-theme .admin-delta-bad {
4246
+ background: hsl(var(--admin-error-light));
4247
+ color: hsl(var(--admin-error-dark));
4248
+ }
4249
+ .rovela-admin-theme .admin-delta-flat {
4250
+ background: hsl(var(--admin-background-subtle) / 0.7);
4251
+ color: hsl(var(--admin-foreground-muted));
4252
+ }
4253
+
4254
+ /* ── Segmented control — period pills (replaces the dropdown) */
4255
+ .rovela-admin-theme .admin-segmented {
4256
+ display: inline-flex;
4257
+ align-items: center;
4258
+ padding: 2px;
4259
+ background: hsl(var(--admin-card));
4260
+ border: var(--admin-border-width) solid hsl(var(--admin-border));
4261
+ border-radius: var(--admin-radius-full);
4262
+ }
4263
+ .rovela-admin-theme .admin-segmented-option {
4264
+ border: none;
4265
+ background: transparent;
4266
+ border-radius: var(--admin-radius-full);
4267
+ padding: var(--admin-space-1) var(--admin-space-3);
4268
+ font-family: var(--admin-font-sans);
4269
+ font-size: var(--admin-text-xs);
4270
+ font-weight: var(--admin-font-medium);
4271
+ color: hsl(var(--admin-foreground-muted));
4272
+ cursor: pointer;
4273
+ transition: var(--admin-transition-colors);
4274
+ }
4275
+ .rovela-admin-theme .admin-segmented-option:hover:not(:disabled):not(.active) {
4276
+ color: hsl(var(--admin-foreground));
4277
+ }
4278
+ .rovela-admin-theme .admin-segmented-option.active {
4279
+ background: hsl(var(--admin-primary));
4280
+ color: hsl(var(--admin-primary-foreground));
4281
+ }
4282
+ .rovela-admin-theme .admin-segmented-option:focus-visible {
4283
+ outline: none;
4284
+ box-shadow: 0 0 0 2px hsl(var(--admin-primary) / 0.3);
4285
+ }
4286
+
4287
+ /* ── Ghost select — quiet in-table controls (row status changers). The old
4288
+ full-bordered 36px selects dominated dense tables; this one whispers until
4289
+ hovered. */
4290
+ .rovela-admin-theme .admin-select-ghost {
4291
+ appearance: none;
4292
+ height: 1.75rem;
4293
+ padding: 0 var(--admin-space-6) 0 var(--admin-space-2);
4294
+ font-family: var(--admin-font-sans);
4295
+ font-size: var(--admin-text-xs);
4296
+ font-weight: var(--admin-font-medium);
4297
+ color: hsl(var(--admin-foreground-muted));
4298
+ background: transparent;
4299
+ border: var(--admin-border-width) solid transparent;
4300
+ border-radius: var(--admin-radius-sm);
4301
+ cursor: pointer;
4302
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%239AA3A0' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
4303
+ background-repeat: no-repeat;
4304
+ background-position: right var(--admin-space-1-5) center;
4305
+ transition: var(--admin-transition-colors);
4306
+ }
4307
+ .rovela-admin-theme .admin-select-ghost:hover {
4308
+ border-color: hsl(var(--admin-border));
4309
+ background-color: hsl(var(--admin-card));
4310
+ color: hsl(var(--admin-foreground));
4311
+ }
4312
+ .rovela-admin-theme .admin-select-ghost:focus {
4313
+ outline: none;
4314
+ border-color: hsl(var(--admin-primary));
4315
+ box-shadow: 0 0 0 3px hsl(var(--admin-primary) / 0.12);
4316
+ background-color: hsl(var(--admin-card));
4317
+ color: hsl(var(--admin-foreground));
4318
+ }
4319
+
4320
+ /* ── Monospace identifier cell (order numbers, SKUs) — ink, not accent.
4321
+ Accent scarcity: identifiers are data, not actions. */
4322
+ .rovela-admin-theme .admin-id {
4323
+ font-family: var(--admin-font-mono);
4324
+ font-size: var(--admin-text-xs);
4325
+ font-weight: var(--admin-font-medium);
4326
+ color: hsl(var(--admin-foreground));
4327
+ letter-spacing: -0.01em;
4328
+ }
4329
+ a.rovela-admin-theme .admin-id:hover,
4330
+ .rovela-admin-theme a .admin-id:hover,
4331
+ .rovela-admin-theme a.admin-id:hover {
4332
+ color: hsl(var(--admin-accent-deep));
4333
+ }
4334
+
4335
+ /* ── Numeric cell — right-aligned tabular money/count columns. */
4336
+ .rovela-admin-theme .admin-cell-num {
4337
+ text-align: right;
4338
+ font-variant-numeric: tabular-nums;
4339
+ }
4340
+ .rovela-admin-theme th.admin-cell-num {
4341
+ text-align: right;
4342
+ }
4343
+
4344
+ /* ── Sidebar utility links (Edit store / View store): quiet footer rows, not
4345
+ boxed buttons — one interaction grammar top to bottom of the sidebar. */
4346
+ .rovela-admin-theme .admin-sidebar-link {
4347
+ display: flex;
4348
+ align-items: center;
4349
+ justify-content: flex-start;
4350
+ gap: var(--admin-space-2-5);
4351
+ width: 100%;
4352
+ padding: 0.375rem var(--admin-space-2-5);
4353
+ font-size: var(--admin-text-sm);
4354
+ font-weight: var(--admin-font-medium);
4355
+ color: hsl(var(--admin-sidebar-foreground-muted));
4356
+ background: transparent;
4357
+ border: none;
4358
+ border-radius: var(--admin-radius-sm);
4359
+ text-decoration: none;
4360
+ cursor: pointer;
4361
+ transition: var(--admin-transition-colors);
4362
+ }
4363
+ .rovela-admin-theme .admin-sidebar-link:hover {
4364
+ background: hsl(var(--admin-foreground) / 0.04);
4365
+ color: hsl(var(--admin-sidebar-foreground));
4366
+ }
4367
+ .rovela-admin-theme .admin-sidebar-link svg {
4368
+ width: 1rem;
4369
+ height: 1rem;
4370
+ }
4371
+
4372
+ /* Decorative stat-card icons RETIRED (premium pass): an icon chip on every
4373
+ KPI is the canonical dashboard-template tell. Hidden at the system level so
4374
+ legacy markup (and CC-generated custom stat cards) lose them too. */
4375
+ .rovela-admin-theme .admin-stat-icon {
4376
+ display: none;
4377
+ }