PluginProbe
Shopping Cart & eCommerce Store / trunk
Shopping Cart & eCommerce Store vtrunk
5.9.4 5.9.3 5.9.2 5.9.1 5.8.17 5.9.0 5.8.16 5.1.6 5.1.7 5.1.8 5.1.9 5.2.0 5.2.1 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.3.0 5.3.1 5.3.10 5.3.11 5.3.12 5.3.13 5.3.14 All 259 releases
wp-easycart / admin / css / shell-v2.css

shell-v2.css in Shopping Cart & eCommerce Store trunk, at admin/css/shell-v2.css

657 lines 33.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * WP EasyCart Admin Shell V2
3 * Namespaced .ecsh-* — safe to load alongside legacy admin.css during transition.
4 *
5 * Theming: shell.php prints :root { --ec-brand + pre-computed fallback shades }
6 * via wp_easycart_shell_output_root_css(). The @supports block below re-derives
7 * the shades with color-mix() on modern browsers, so both paths render
8 * identically (see wp_easycart_shell_theme.php for the math guarantee).
9 *
10 * @since 5.x.x
11 */
12
13 /* ---- Neutral tokens (mirror admin-v2.css) ---- */
14 :root {
15 --ecsh-g50:#f9fafb; --ecsh-g100:#f3f4f6; --ecsh-g200:#e5e7eb; --ecsh-g300:#d1d5db;
16 --ecsh-g400:#9ca3af; --ecsh-g500:#6b7280; --ecsh-g600:#4b5563; --ecsh-g700:#374151;
17 --ecsh-g800:#1f2937; --ecsh-g900:#111827;
18 --ecsh-green:#22c55e; --ecsh-red:#ef4444; --ecsh-amber:#f59e0b;
19 --ecsh-r:8px; --ecsh-rs:6px;
20 --ecsh-sh:0 1px 3px rgba(0,0,0,.1),0 1px 2px rgba(0,0,0,.06);
21 --ecsh-shlg:0 10px 25px -5px rgba(0,0,0,.15),0 8px 10px -6px rgba(0,0,0,.08);
22 --ecsh-tr:150ms ease;
23 --ecsh-sidebar-w:240px;
24 --ecsh-topbar-h:56px;
25 --ecsh-adminbar:32px; /* WP admin bar */
26 }
27 @media (max-width:782px){ :root { --ecsh-adminbar:46px; } }
28 /* Below 600px WordPress makes #wpadminbar position:absolute — it scrolls away with the page — so
29 nothing sticky should reserve room for it. Every sticky offset in the shell and the editors
30 derives from this variable, so this one line corrects all of them. */
31 @media (max-width:600px){ :root { --ecsh-adminbar:0px; } }
32
33 /* ---- Modern shade derivation (overrides the PHP-printed fallbacks) ---- */
34 @supports (color: color-mix(in srgb, red, blue)) {
35 :root {
36 --ec-brand-hover: color-mix(in srgb, var(--ec-brand), #000 12%);
37 --ec-brand-active: color-mix(in srgb, var(--ec-brand), #000 22%);
38 --ec-brand-deep: color-mix(in srgb, var(--ec-brand), #000 42%);
39 --ec-brand-soft: color-mix(in srgb, var(--ec-brand), #fff 90%);
40 --ec-brand-softer: color-mix(in srgb, var(--ec-brand), #fff 95%);
41 --ec-on-brand-dim: color-mix(in srgb, var(--ec-on-brand), var(--ec-brand) 28%);
42 }
43 }
44
45 /* ---- Sidebar surface mapping (brand style; a body class can add
46 a neutral variant later without touching components) ---- */
47 .ecsh-app {
48 --sb-bg: var(--ec-brand);
49 --sb-panel: var(--ec-brand-deep);
50 --sb-item: var(--ec-on-brand-dim);
51 --sb-item-hover-bg: rgba(255,255,255,.10);
52 --sb-active-bg: var(--ec-brand-active);
53 --sb-head: var(--ec-on-brand-dim);
54 }
55 .ecsh-app.ecsh-sidebar-neutral {
56 --sb-bg: var(--ecsh-g900);
57 --sb-panel: #0c1220;
58 --sb-item: var(--ecsh-g400);
59 --sb-item-hover-bg: rgba(255,255,255,.06);
60 --sb-active-bg: var(--ec-brand-deep);
61 --sb-head: var(--ecsh-g500);
62 }
63
64 /* =========================================================
65 APP FRAME (bleeds over #wpbody-content's 20px gutter like
66 the old .ec_admin_wrap did)
67 ========================================================= */
68 .ecsh-app {
69 display:flex; margin:0 0 0 -20px; min-height:calc(100vh - var(--ecsh-adminbar));
70 font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;
71 font-size:14px; color:var(--ecsh-g800); background:var(--ecsh-g100);
72 -webkit-font-smoothing:antialiased;
73 /* WP only pads #wpcontent on the LEFT (20px; 10px <=782px), so the frame
74 bleeds left only — a symmetric negative margin overflows to the right. */
75 }
76 .ecsh-app *, .ecsh-app *::before, .ecsh-app *::after { box-sizing:border-box; }
77 .ecsh-app a { text-decoration:none; }
78 .ecsh-app button { font:inherit; cursor:pointer; }
79 .ecsh-app button:focus-visible,
80 .ecsh-app a:focus-visible,
81 .ecsh-app input:focus-visible { outline:2px solid var(--ec-brand); outline-offset:2px; }
82
83 /* =========================================================
84 SIDEBAR
85 ========================================================= */
86 .ecsh-sidebar {
87 width:var(--ecsh-sidebar-w); flex-shrink:0;
88 background:var(--sb-bg);
89 display:flex; flex-direction:column;
90 transition:background var(--ecsh-tr);
91 position:sticky; top:var(--ecsh-adminbar);
92 height:calc(100vh - var(--ecsh-adminbar));
93 overflow-y:auto;
94 scrollbar-width:thin; scrollbar-color:rgba(255,255,255,.25) transparent;
95 z-index:20;
96 }
97
98 /* Brand header — reuses the existing admin-logo.png (174x70 box, white
99 artwork designed to sit on the brand-colored surface). Swap for an
100 SVG/2x asset later without touching markup. */
101 .ecsh-brand { display:block; padding:8px 8px 2px; }
102 .ecsh-brand-logo {
103 height:70px;
104 background:url(../images/admin-logo.png) center 5px no-repeat;
105 filter:drop-shadow(0 1px 2px rgba(0,0,0,.2));
106 }
107
108 .ecsh-sb-store {
109 margin:8px 14px 12px; display:flex; align-items:center; justify-content:center; gap:7px;
110 padding:8px 12px; border-radius:var(--ecsh-r);
111 background:rgba(255,255,255,.12); color:var(--ec-on-brand); font-weight:600; font-size:13px;
112 border:1px solid rgba(255,255,255,.18);
113 transition:background var(--ecsh-tr);
114 }
115 .ecsh-sb-store:hover { background:rgba(255,255,255,.20); color:var(--ec-on-brand); }
116 .ecsh-sb-store svg { width:14px; height:14px; }
117
118 /* Sales snapshot (shown when ec_option_admin_display_sales_goal) */
119 .ecsh-sb-sales { margin:0 14px 14px; padding:12px 14px; border-radius:var(--ecsh-r); background:rgba(0,0,0,.18); }
120 .ecsh-sb-sales-row { display:flex; align-items:baseline; justify-content:space-between; }
121 .ecsh-sb-sales-label { font-size:11px; color:var(--sb-item); font-weight:500; }
122 .ecsh-sb-sales-amt { color:var(--ec-on-brand); font-size:17px; font-weight:700; }
123 .ecsh-sb-sales-delta { font-size:11px; font-weight:600; color:#fca5a5; }
124 .ecsh-sb-sales-delta.ecsh-up { color:#86efac; }
125 .ecsh-sb-goal-track { height:4px; border-radius:2px; background:rgba(255,255,255,.18); margin-top:10px; overflow:hidden; }
126 .ecsh-sb-goal-fill { height:100%; background:var(--ec-on-brand); border-radius:2px; }
127 .ecsh-sb-goal-caption { display:flex; justify-content:space-between; margin-top:6px; font-size:10.5px; color:var(--sb-item); }
128
129 /* Nav */
130 .ecsh-sb-nav { flex:1; padding:2px 10px 12px; }
131 .ecsh-sb-item {
132 display:flex; align-items:stretch; width:100%;
133 border-radius:var(--ecsh-r); position:relative; margin-bottom:1px;
134 color:var(--sb-item);
135 transition:background var(--ecsh-tr), color var(--ecsh-tr);
136 }
137 .ecsh-sb-item:hover { background:var(--sb-item-hover-bg); color:var(--ec-on-brand); }
138 .ecsh-sb-item.ecsh-active { background:var(--sb-active-bg); color:var(--ec-on-brand); }
139 .ecsh-sb-item.ecsh-active::before {
140 content:""; position:absolute; left:-10px; top:7px; bottom:7px; width:3px;
141 border-radius:0 3px 3px 0; background:var(--ec-on-brand);
142 }
143 .ecsh-sb-item > a {
144 flex:1; display:flex; align-items:center; gap:10px; min-width:0;
145 padding:9px 10px; color:inherit; font-size:13.5px; font-weight:500;
146 }
147 .ecsh-sb-item.ecsh-active > a { font-weight:600; }
148 .ecsh-sb-item svg.ecsh-ico { width:17px; height:17px; flex-shrink:0; opacity:.9; }
149 .ecsh-sb-item .ecsh-badge {
150 margin-left:auto; font-size:10.5px; font-weight:700; padding:1px 7px;
151 border-radius:10px; background:rgba(255,255,255,.16); color:var(--ec-on-brand);
152 align-self:center;
153 }
154 .ecsh-sb-item .ecsh-badge.ecsh-danger { background:var(--ecsh-red); color:#fff; }
155 .ecsh-sb-item .ecsh-badge.ecsh-warn { background:var(--ecsh-amber); color:#fff; }
156 .ecsh-sb-chev {
157 display:flex; align-items:center; justify-content:center; width:32px;
158 border:0; background:transparent; color:inherit; opacity:.6; border-radius:var(--ecsh-r);
159 }
160 .ecsh-sb-chev:hover { opacity:1; }
161 .ecsh-sb-chev svg { width:14px; height:14px; transition:transform var(--ecsh-tr); }
162 .ecsh-sb-chev[aria-expanded="true"] svg { transform:rotate(90deg); }
163 /* Legacy lock icon filter output inside labels */
164 .ecsh-sb-item .dashicons-lock, .ecsh-sb-sub .dashicons-lock { font-size:14px; width:14px; height:14px; margin-left:auto; }
165 .ecsh-sb-sub .dashicons-lock { float:right; }
166
167 /* Submenu accordion — identical on desktop and in the mobile drawer */
168 .ecsh-sb-sub { overflow:hidden; max-height:0; transition:max-height 220ms ease; }
169 .ecsh-sb-sub.ecsh-open { max-height:900px; }
170 .ecsh-sb-sub-inner { margin:2px 0 6px; padding:6px 0; border-radius:var(--ecsh-r); background:var(--sb-panel); }
171 .ecsh-sb-sub a {
172 display:block; padding:6px 14px 6px 38px; font-size:12.5px; color:var(--sb-item);
173 transition:color var(--ecsh-tr), background var(--ecsh-tr);
174 }
175 .ecsh-sb-sub a:hover { color:var(--ec-on-brand); background:rgba(255,255,255,.06); }
176 .ecsh-sb-sub a.ecsh-current { color:var(--ec-on-brand); font-weight:600; position:relative; }
177 .ecsh-sb-sub a.ecsh-current::before {
178 content:""; position:absolute; left:24px; top:50%; transform:translateY(-50%);
179 width:5px; height:5px; border-radius:50%; background:var(--ec-on-brand);
180 }
181 .ecsh-sb-sub-head { padding:9px 14px 3px 24px; font-size:10.5px; font-weight:700; color:var(--sb-head); }
182
183 /* Footer: trial/license + powered-by */
184 .ecsh-sb-foot { padding:10px 14px 14px; border-top:1px solid rgba(255,255,255,.12); }
185 .ecsh-sb-trial { font-size:11.5px; color:var(--sb-item); line-height:1.45; }
186 .ecsh-sb-trial strong { color:var(--ec-on-brand); display:block; margin-bottom:2px; }
187 .ecsh-sb-trial a { color:var(--ec-on-brand); text-decoration:underline; text-underline-offset:2px; }
188 .ecsh-sb-powered {
189 margin-top:10px; display:block; font-size:10.5px; color:var(--sb-item); opacity:.9;
190 }
191 .ecsh-sb-powered:hover { color:var(--ec-on-brand); opacity:1; }
192
193 /* =========================================================
194 MAIN COLUMN + TOP BAR
195 ========================================================= */
196 .ecsh-main { flex:1; min-width:0; display:flex; flex-direction:column; }
197
198 .ecsh-topbar {
199 height:var(--ecsh-topbar-h); background:#fff; border-bottom:1px solid var(--ecsh-g200);
200 display:flex; align-items:center; gap:10px; padding:0 20px;
201 position:sticky; top:var(--ecsh-adminbar); z-index:30;
202 }
203 .ecsh-tb-hamburger { display:none; }
204 .ecsh-tb-logo { display:none; }
205 .ecsh-tb-crumb { display:flex; align-items:center; gap:7px; font-size:13px; color:var(--ecsh-g500); min-width:0; }
206 .ecsh-tb-crumb .ecsh-sep { color:var(--ecsh-g300); }
207 .ecsh-tb-crumb .ecsh-crumb-link { color:var(--ecsh-g500); white-space:nowrap; transition:color var(--ecsh-tr); }
208 .ecsh-tb-crumb .ecsh-crumb-link:hover { color:var(--ec-brand); }
209 .ecsh-tb-crumb .ecsh-here { color:var(--ecsh-g900); font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
210
211 /* Docs search (same GET form/behavior as the old sidebar search).
212 WP forms.css gives admin inputs min-height/border/shadow — neutralize
213 them so the field fits the 56px bar and reads as one control. */
214 .ecsh-tb-search {
215 margin-left:auto; display:flex; align-items:center; gap:7px;
216 height:36px; background:var(--ecsh-g50); border:1px solid var(--ecsh-g300);
217 border-radius:var(--ecsh-r);
218 padding:0 12px; width:230px; color:var(--ecsh-g500); font-size:13px;
219 transition:border-color var(--ecsh-tr), background var(--ecsh-tr);
220 overflow:hidden;
221 }
222 .ecsh-tb-search:focus-within { background:#fff; border-color:var(--ec-brand); }
223 .ecsh-tb-search input,
224 .ecsh-tb-search input[type="text"] {
225 border:0 !important; outline:0; background:transparent !important;
226 box-shadow:none !important; border-radius:0;
227 width:100%; height:100%; min-height:0; margin:0; padding:0;
228 font-size:13px; line-height:34px; color:var(--ecsh-g800);
229 }
230 .ecsh-tb-search input::placeholder { color:var(--ecsh-g500); opacity:1; }
231 .ecsh-tb-search svg { width:14px; height:14px; flex-shrink:0; }
232 .ecsh-tb-search-kbd {
233 font-size:10px; color:var(--ecsh-g400); border:1px solid var(--ecsh-g300); border-radius:4px;
234 padding:0 4px; background:#fff; font-family:inherit; flex-shrink:0;
235 }
236 /* Icon-only trigger when the full search field is hidden (<900px) */
237 .ecsh-tb-search-btn {
238 display:none; align-items:center; justify-content:center;
239 width:36px; height:36px; margin-left:auto;
240 border:1px solid var(--ecsh-g300); border-radius:var(--ecsh-r); background:#fff;
241 color:var(--ecsh-g600); transition:all var(--ecsh-tr);
242 }
243 .ecsh-tb-search-btn:hover { border-color:var(--ecsh-g400); color:var(--ecsh-g800); }
244 .ecsh-tb-search-btn svg { width:16px; height:16px; }
245
246 /* ---- Command palette ---- */
247 .ecsh-palette { position:fixed; inset:0; z-index:100000; }
248 .ecsh-palette[hidden] { display:none; }
249 .ecsh-palette-backdrop { position:absolute; inset:0; background:rgba(17,24,39,.45); }
250 .ecsh-palette-panel {
251 position:relative; width:min(560px, calc(100vw - 24px));
252 margin:min(14vh, 120px) auto 0;
253 background:#fff; border:1px solid var(--ecsh-g200); border-radius:12px;
254 box-shadow:var(--ecsh-shlg); overflow:hidden;
255 }
256 .ecsh-palette-inputrow {
257 display:flex; align-items:center; gap:10px;
258 padding:14px 16px; border-bottom:1px solid var(--ecsh-g200);
259 color:var(--ecsh-g400);
260 }
261 .ecsh-palette-inputrow svg { width:17px; height:17px; flex-shrink:0; }
262 .ecsh-palette-inputrow input,
263 .ecsh-palette-inputrow input[type="text"] {
264 flex:1; border:0 !important; outline:0; background:transparent !important;
265 box-shadow:none !important; min-height:0; margin:0; padding:0;
266 font-size:15px; color:var(--ecsh-g900);
267 }
268 .ecsh-palette-inputrow kbd {
269 font-size:10px; color:var(--ecsh-g400); border:1px solid var(--ecsh-g300);
270 border-radius:4px; padding:1px 5px; background:var(--ecsh-g50); font-family:inherit;
271 }
272 .ecsh-palette-results { max-height:min(50vh, 380px); overflow-y:auto; padding:6px; }
273 .ecsh-palette-item {
274 display:flex; align-items:center; gap:10px; width:100%;
275 padding:9px 10px; border:0; border-radius:var(--ecsh-r); background:transparent;
276 font-size:13.5px; color:var(--ecsh-g800); text-align:left; cursor:pointer;
277 }
278 .ecsh-palette-item svg { width:15px; height:15px; flex-shrink:0; color:var(--ecsh-g400); }
279 .ecsh-palette-item .ecsh-palette-group { margin-left:auto; font-size:11.5px; color:var(--ecsh-g400); white-space:nowrap; }
280 .ecsh-palette-item.ecsh-selected,
281 .ecsh-palette-item:hover { background:var(--ec-brand-softer); }
282 .ecsh-palette-item.ecsh-selected svg,
283 .ecsh-palette-item:hover svg { color:var(--ec-brand); }
284 .ecsh-palette-item-docs { border-top:1px solid var(--ecsh-g100); margin-top:4px; padding-top:11px; color:var(--ec-brand); font-weight:600; }
285 .ecsh-palette-item-docs svg { color:var(--ec-brand); }
286 .ecsh-palette-empty { padding:10px 12px 4px; font-size:12.5px; color:var(--ecsh-g500); }
287
288 /* Section-jump landing highlight */
289 .ecsh-jump-highlight {
290 background:var(--ec-brand-softer) !important;
291 box-shadow:0 0 0 3px var(--ec-brand-softer);
292 border-radius:var(--ecsh-rs);
293 transition:background 600ms ease, box-shadow 600ms ease;
294 }
295
296 .ecsh-tb-btn {
297 display:flex; align-items:center; gap:6px; padding:7px 12px;
298 border:1px solid var(--ecsh-g300); border-radius:var(--ecsh-r); background:#fff;
299 font-size:13px; font-weight:500; color:var(--ecsh-g700);
300 transition:all var(--ecsh-tr); white-space:nowrap;
301 }
302 .ecsh-tb-btn:hover { border-color:var(--ecsh-g400); background:var(--ecsh-g50); color:var(--ecsh-g800); }
303 .ecsh-tb-btn svg { width:15px; height:15px; }
304
305 /* Help dropdown (absorbs the old marketing header links) */
306 .ecsh-tb-menu { position:relative; }
307 .ecsh-tb-dropdown {
308 position:absolute; right:0; top:calc(100% + 6px); width:230px;
309 background:#fff; border:1px solid var(--ecsh-g200); border-radius:var(--ecsh-r);
310 box-shadow:var(--ecsh-shlg); padding:6px; display:none; z-index:50;
311 }
312 .ecsh-tb-menu.ecsh-open .ecsh-tb-dropdown { display:block; }
313 .ecsh-tb-dropdown a {
314 display:flex; align-items:center; gap:9px; padding:8px 10px; border-radius:var(--ecsh-rs);
315 font-size:13px; color:var(--ecsh-g700);
316 }
317 .ecsh-tb-dropdown a:hover { background:var(--ecsh-g100); color:var(--ecsh-g900); }
318 .ecsh-tb-dropdown a .dashicons { font-size:15px; width:15px; height:15px; color:var(--ecsh-g400); }
319 .ecsh-tb-dropdown .ecsh-dd-sep { height:1px; background:var(--ecsh-g200); margin:5px 4px; }
320
321 /* Expandable group inside the Help dropdown (Video Tutorials).
322 Accordion, not hover-flyout, so it works on touch. */
323 .ecsh-tb-dropdown { max-height:min(70vh, 520px); overflow-y:auto; overscroll-behavior:contain; }
324 .ecsh-dd-group-toggle {
325 display:flex; align-items:center; gap:9px; width:100%;
326 padding:8px 10px; border:0; border-radius:var(--ecsh-rs); background:transparent;
327 font-size:13px; color:var(--ecsh-g700); text-align:left;
328 }
329 .ecsh-dd-group-toggle:hover { background:var(--ecsh-g100); color:var(--ecsh-g900); }
330 .ecsh-dd-group-toggle .dashicons { font-size:15px; width:15px; height:15px; color:var(--ecsh-g400); }
331 .ecsh-dd-chev { width:13px; height:13px; margin-left:auto; color:var(--ecsh-g400); transition:transform var(--ecsh-tr); }
332 .ecsh-dd-group-toggle[aria-expanded="true"] .ecsh-dd-chev { transform:rotate(90deg); }
333 .ecsh-dd-group-body { display:none; padding:2px 0 4px; }
334 .ecsh-dd-group.ecsh-open .ecsh-dd-group-body { display:block; }
335 .ecsh-tb-dropdown .ecsh-dd-group-body a { padding:6px 10px 6px 34px; font-size:12.5px; color:var(--ecsh-g600); }
336 .ecsh-tb-dropdown .ecsh-dd-group-body a:hover { color:var(--ecsh-g900); }
337 .ecsh-tb-dropdown .ecsh-dd-group-body a.ecsh-dd-more { color:var(--ec-brand); font-weight:600; }
338
339 /* Color selector — keeps #ec_admin_shell_color id + nonce for the
340 existing ec_admin_ajax_save_color_scheme AJAX action */
341 .ecsh-tb-color {
342 display:flex; align-items:center; gap:8px; padding:5px 10px 5px 6px;
343 border:1px solid var(--ecsh-g300); border-radius:var(--ecsh-r); background:#fff;
344 transition:border-color var(--ecsh-tr);
345 }
346 .ecsh-tb-color:hover { border-color:var(--ecsh-g400); }
347 .ecsh-tb-color-swatch {
348 width:24px; height:24px; border-radius:6px; background:var(--ec-brand);
349 border:2px solid #fff; box-shadow:0 0 0 1px var(--ecsh-g300); position:relative; overflow:hidden;
350 cursor:pointer; flex-shrink:0;
351 }
352 .ecsh-tb-color-swatch input[type="color"] {
353 position:absolute; inset:-6px; opacity:0; cursor:pointer; width:44px; height:44px;
354 border:0; padding:0; background:none;
355 }
356 .ecsh-tb-color-label { font-size:12.5px; color:var(--ecsh-g600); font-weight:500; }
357
358 /* =========================================================
359 CONTENT AREA + LEGACY COMPAT
360 ========================================================= */
361 /* overflow-x:clip prevents wide content from widening the page WITHOUT
362 creating a scroll container — unlike auto/hidden/scroll, clip keeps
363 position:sticky descendants (product editor header/rail) working
364 against the viewport, and clip on the x-axis leaves overflow-y
365 visible, so row-action menus can still hang below their tables.
366 (Do NOT put overflow-x:auto on .ecv2-table-scroll at desktop widths:
367 a scroll value forces overflow-y to auto and clips row menus —
368 admin-v2.css already enables it under 640px containers by design.) */
369 .ecsh-content { padding:20px; flex:1; min-width:0; overflow-x:clip; }
370
371 /* Legacy pages style against .ec_admin_content_area descendants; keep the
372 class on our wrapper but neutralize its old box styling (loads after admin.css).
373 NOTE: this selector (0,2,0) outweighs .ecsh-content (0,1,0) on the same
374 element, so it must CARRY the real padding — legacy admin.css sets its own
375 (15px / 5px small) which would otherwise leak through. */
376 .ecsh-main .ec_admin_content_area {
377 float:none; width:auto; max-width:none; margin:0; padding:20px;
378 border:0 !important; background:transparent; min-height:0;
379 }
380 .ecsh-main .ec_admin_mobile_menu_button { display:none; }
381
382 /* =========================================================
383 PRODUCT EDITOR V2 STICKY COORDINATION
384 admin-details-v2.css pins .ecdv2-header at top:32px and
385 .ecdv2-rail at top:96px — tuned for the old shell where only
386 the WP admin bar sat above them. Inside the new shell they must
387 stack BELOW the sticky topbar; original header→rail deltas
388 (64px desktop / 58px mobile) are preserved.
389 ========================================================= */
390 .ecsh-main .ecdv2-header {
391 top:calc(var(--ecsh-adminbar) + var(--ecsh-topbar-h) + 8px);
392 z-index:25; /* below the shell topbar (30) so it can never cover it */
393 }
394 .ecsh-main .ecdv2-rail {
395 top:calc(var(--ecsh-adminbar) + var(--ecsh-topbar-h) + 8px + 64px);
396 }
397
398 /* =========================================================
399 MOBILE (<=782px, the WP breakpoint)
400 ========================================================= */
401 .ecsh-scrim { display:none; }
402 .ecsh-bottom-nav { display:none; }
403
404 @media (max-width:900px){
405 .ecsh-tb-color-label, .ecsh-tb-search, .ecsh-tb-search-kbd { display:none; }
406 .ecsh-tb-search-btn { display:flex; }
407 }
408
409 @media (max-width:782px){
410 .ecsh-app { margin:0 0 0 -10px; }
411
412 .ecsh-sidebar {
413 position:fixed; left:0; top:var(--ecsh-adminbar); bottom:0; z-index:99999;
414 transform:translateX(-100%); transition:transform 240ms ease;
415 width:min(300px, 84vw); height:auto;
416 }
417 body.ecsh-drawer-open .ecsh-sidebar { transform:translateX(0); box-shadow:var(--ecsh-shlg); }
418 .ecsh-scrim {
419 display:block; position:fixed; inset:var(--ecsh-adminbar) 0 0 0; z-index:99998;
420 background:rgba(17,24,39,.5);
421 opacity:0; pointer-events:none; transition:opacity 200ms ease;
422 }
423 body.ecsh-drawer-open .ecsh-scrim { opacity:1; pointer-events:auto; }
424
425 .ecsh-tb-hamburger {
426 display:flex; align-items:center; justify-content:center;
427 width:38px; height:38px; border:0; background:transparent; border-radius:var(--ecsh-r);
428 color:var(--ecsh-g700); margin-left:-8px;
429 }
430 .ecsh-tb-hamburger:hover { background:var(--ecsh-g100); }
431 .ecsh-tb-hamburger svg { width:20px; height:20px; }
432
433 /* Compact brand chip: the white PNG needs a brand-colored backdrop
434 to stay visible on the white top bar */
435 .ecsh-tb-logo {
436 display:block; width:96px; height:34px; border-radius:7px; flex-shrink:0;
437 background:var(--ec-brand) url(../images/admin-logo.png) center / auto 26px no-repeat;
438 }
439 .ecsh-tb-crumb .ecsh-trail { display:none; }
440
441 .ecsh-topbar { padding:0 12px; }
442 /* Must include the compat selector: same specificity or the desktop
443 padding above wins and the bottom tab bar overlaps content */
444 .ecsh-content,
445 .ecsh-main .ec_admin_content_area { padding:14px 12px calc(76px + env(safe-area-inset-bottom)); }
446
447 /* Bottom tab bar — persistent nav for mobile-first store owners */
448 .ecsh-bottom-nav {
449 display:flex; position:fixed; left:0; right:0; bottom:0; z-index:9999;
450 background:#fff; border-top:1px solid var(--ecsh-g200);
451 padding:6px 4px calc(6px + env(safe-area-inset-bottom));
452 box-shadow:0 -4px 12px rgba(0,0,0,.05);
453 }
454 .ecsh-bn-item {
455 flex:1; display:flex; flex-direction:column; align-items:center; gap:3px;
456 padding:5px 2px; border:0; background:transparent; color:var(--ecsh-g500);
457 font-size:10.5px; font-weight:500; border-radius:var(--ecsh-r); position:relative;
458 }
459 .ecsh-bn-item svg { width:21px; height:21px; }
460 .ecsh-bn-item.ecsh-active { color:var(--ec-brand); font-weight:600; }
461 .ecsh-bn-item .ecsh-bn-badge {
462 position:absolute; top:1px; right:calc(50% - 20px);
463 background:var(--ecsh-red); color:#fff; font-size:9px; font-weight:700;
464 padding:1px 5px; border-radius:8px;
465 }
466
467 /* Product editor V2 on mobile: rail sticks below the shell topbar
468 (original 58px delta preserved); toasts clear the bottom tab bar */
469 .ecsh-main .ecdv2-rail { top:calc(var(--ecsh-adminbar) + var(--ecsh-topbar-h) + 8px + 58px); }
470 .ecsh-main .ecdv2-toasts { bottom:calc(84px + env(safe-area-inset-bottom)); }
471 }
472
473 @media (prefers-reduced-motion: reduce){
474 .ecsh-app *, .ecsh-sidebar, .ecsh-scrim, .ecsh-sb-sub { transition:none !important; }
475 }
476
477 /* =========================================================
478 ECV2 CONSISTENCY BRIDGE
479 Minimal overrides so the upgraded panels (products, orders,
480 users, offers) pick up the user's brand color for INTERACTIVE
481 accents while semantic colors (green=on/success, red=danger,
482 amber=warn) stay untouched. Load after admin-v2.css.
483 ========================================================= */
484 .ecv2-wrap .ecv2-btn-primary { background:var(--ec-brand); border-color:var(--ec-brand); color:var(--ec-on-brand); }
485 .ecv2-wrap .ecv2-btn-primary:hover { background:var(--ec-brand-hover); border-color:var(--ec-brand-hover); color:var(--ec-on-brand); }
486
487 .ecv2-wrap .ecv2-stat-card:hover { border-color:var(--ec-brand); }
488 .ecv2-wrap .ecv2-stat-active { border-color:var(--ec-brand); background:var(--ec-brand-softer); }
489
490 .ecv2-wrap .ecv2-btn:focus-visible,
491 .ecv2-wrap a:focus-visible,
492 .ecv2-wrap input:focus-visible,
493 .ecv2-wrap select:focus-visible { outline:2px solid var(--ec-brand); outline-offset:2px; }
494
495 .ecv2-wrap .ecv2-stat-toggle-btn:hover,
496 .ecv2-wrap .ecv2-stat-toggle-btn[aria-expanded="true"] { border-color:var(--ec-brand); color:var(--ec-brand); }
497 .ecv2-wrap .ecv2-stat-toggle-btn[aria-expanded="true"] { background:var(--ec-brand-softer); }
498
499 /* Row hover tint on v2 tables */
500 .ecv2-wrap tbody tr:hover td { background:var(--ec-brand-softer); }
501
502 /* Row-action menus must escape the table: admin-v2.css puts
503 overflow:hidden on .ecv2-table (for corner rounding), which clips the
504 absolutely-positioned .ecv2-row-menu — fully hiding it on short tables.
505 Unclip, and re-round the corners on the cells themselves so the card
506 look is unchanged. */
507 .ecsh-main .ecv2-table { overflow:visible; }
508 .ecsh-main .ecv2-table thead th:first-child { border-top-left-radius:calc(var(--ecv2-r, 8px) - 1px); }
509 .ecsh-main .ecv2-table thead th:last-child { border-top-right-radius:calc(var(--ecv2-r, 8px) - 1px); }
510 .ecsh-main .ecv2-table tbody tr:last-child td:first-child { border-bottom-left-radius:calc(var(--ecv2-r, 8px) - 1px); }
511 .ecsh-main .ecv2-table tbody tr:last-child td:last-child { border-bottom-right-radius:calc(var(--ecv2-r, 8px) - 1px); }
512
513 /* ==========================================================================
514 Shared admin notice card (wpec-pro-notice)
515 --------------------------------------------------------------------------
516 Used by core health notices (PRO activation, Square connection, database
517 repair — wp_easycart_admin.php print_core_notices_in_shell) AND by the
518 PRO plugin's license banners (trial active/expired, registration info).
519 Defined HERE in core shell-v2.css, not in the PRO stylesheet, because the
520 PRO-activation banner renders exactly when the PRO plugin's CSS is not
521 loaded. If the PRO stylesheet carries its own copy of these rules, treat
522 this block as canonical and remove the PRO copy to avoid drift.
523 ========================================================================== */
524 .wpec-pro-notice {
525 display: flex;
526 align-items: center;
527 gap: 12px;
528 background: #fff;
529 border: 1px solid #dcdcde;
530 border-radius: 10px;
531 padding: 13px 16px;
532 margin: 0 0 18px;
533 font-size: 13px;
534 line-height: 1.45;
535 color: #1d2327;
536 }
537 .wpec-pro-notice-icon.dashicons {
538 flex: 0 0 auto;
539 width: 22px;
540 height: 22px;
541 font-size: 22px;
542 line-height: 1;
543 color: #646970;
544 }
545 .wpec-pro-notice-body {
546 flex: 1 1 auto;
547 min-width: 0;
548 }
549 .wpec-pro-notice-body a {
550 color: inherit;
551 font-weight: 600;
552 text-decoration: underline;
553 }
554 .wpec-pro-notice-button {
555 flex: 0 0 auto;
556 display: inline-block;
557 background: #1d2327;
558 color: #fff !important;
559 font-size: 12px;
560 font-weight: 600;
561 padding: 8px 16px;
562 border-radius: 8px;
563 text-decoration: none;
564 white-space: nowrap;
565 transition: background .15s ease;
566 }
567 .wpec-pro-notice-button:hover,
568 .wpec-pro-notice-button:focus {
569 background: #3c434a;
570 color: #fff;
571 }
572
573 /* Variants: a tinted left accent + icon color; backgrounds stay calm so
574 stacked notices don't shout. */
575 .wpec-pro-notice--brand { border-left: 4px solid #2ebd59; }
576 .wpec-pro-notice--brand .wpec-pro-notice-icon.dashicons { color: #2ebd59; }
577 .wpec-pro-notice--brand .wpec-pro-notice-button { background: #2ebd59; }
578 .wpec-pro-notice--brand .wpec-pro-notice-button:hover,
579 .wpec-pro-notice--brand .wpec-pro-notice-button:focus { background: #219a47; }
580
581 .wpec-pro-notice--danger { border-left: 4px solid #d63638; background: #fdf5f5; }
582 .wpec-pro-notice--danger .wpec-pro-notice-icon.dashicons { color: #d63638; }
583
584 .wpec-pro-notice--info { border-left: 4px solid #72aee6; }
585 .wpec-pro-notice--info .wpec-pro-notice-icon.dashicons { color: #2271b1; }
586
587 /* Stacked variant: multi-line content (e.g. the database repair notice with
588 its expandable error list) — icon aligns to the first line instead of
589 center, and inner paragraphs tighten up. */
590 .wpec-pro-notice--stacked { align-items: flex-start; }
591 .wpec-pro-notice--stacked .wpec-pro-notice-icon.dashicons { margin-top: 1px; }
592 .wpec-pro-notice--stacked .wpec-pro-notice-body p { margin: 0 0 6px; }
593 .wpec-pro-notice--stacked .wpec-pro-notice-body p:last-child { margin-bottom: 0; }
594 .wpec-pro-notice--stacked .wpec-pro-notice-body ul { margin: 6px 0 0 18px; list-style: disc; }
595
596 /* Narrow screens: button drops below the text. */
597 @media ( max-width: 600px ) {
598 .wpec-pro-notice { flex-wrap: wrap; }
599 .wpec-pro-notice-button { margin-left: 34px; }
600 }
601
602 /* =========================================================
603 LICENSE RENEWAL — top-bar pill, sidebar block, popup
604 ========================================================= */
605 .ecsh-tb-license { display:inline-flex; align-items:center; gap:7px; height:34px; padding:0 6px 0 10px; border-radius:999px; border:1px solid #fde68a; background:#fffbeb; color:#92400e; font:inherit; font-size:12.5px; font-weight:600; cursor:pointer; white-space:nowrap; }
606 .ecsh-tb-license .dashicons { font-size:15px; width:15px; height:15px; color:#d97706; }
607 .ecsh-tb-license-cta { padding:3px 9px; border-radius:999px; background:#d97706; color:#fff; font-size:11px; font-weight:700; }
608 .ecsh-tb-license:hover { background:#fef3c7; }
609 .ecsh-tb-license.is-critical, .ecsh-tb-license.is-lapsed { border-color:#fecaca; background:#fef2f2; color:#991b1b; }
610 .ecsh-tb-license.is-critical .dashicons, .ecsh-tb-license.is-lapsed .dashicons { color:var(--ecsh-red); }
611 .ecsh-tb-license.is-critical .ecsh-tb-license-cta, .ecsh-tb-license.is-lapsed .ecsh-tb-license-cta { background:var(--ecsh-red); }
612 .ecsh-tb-license.is-critical:hover, .ecsh-tb-license.is-lapsed:hover { background:#fee2e2; }
613 .ecsh-tb-license.is-critical { animation:ecsh-pulse 2.4s ease-in-out infinite; }
614 @keyframes ecsh-pulse { 0%,100% { box-shadow:0 0 0 0 rgba(239,68,68,0); } 50% { box-shadow:0 0 0 4px rgba(239,68,68,.18); } }
615 @media (prefers-reduced-motion: reduce) { .ecsh-tb-license.is-critical { animation:none; } }
616 @media screen and (max-width:1100px) { .ecsh-tb-license-text { display:none; } .ecsh-tb-license { padding-left:8px; } }
617
618 .ecsh-sb-renew { display:block; width:100%; text-align:left; margin:0 0 4px; padding:10px 12px; border-radius:8px; border:1px solid rgba(255,255,255,.14); background:rgba(255,255,255,.06); color:var(--sb-item); font:inherit; cursor:pointer; }
619 .ecsh-sb-renew:hover { background:rgba(255,255,255,.1); }
620 .ecsh-sb-renew strong { display:block; font-size:12px; color:var(--ec-on-brand); margin:6px 0 2px; }
621 .ecsh-sb-renew span:last-child { display:block; font-size:11px; line-height:1.4; opacity:.9; }
622 .ecsh-sb-renew-bar { display:block; height:4px; border-radius:2px; background:rgba(255,255,255,.14); overflow:hidden; }
623 .ecsh-sb-renew-bar > span { display:block; height:100%; border-radius:2px; background:var(--ecsh-amber); }
624 .ecsh-sb-renew.is-critical .ecsh-sb-renew-bar > span, .ecsh-sb-renew.is-lapsed .ecsh-sb-renew-bar > span { background:var(--ecsh-red); }
625
626 .ecsh-renewal-modal { position:fixed; inset:0; z-index:100000; background:rgba(17,24,39,.55); display:none; align-items:center; justify-content:center; padding:24px; }
627 body.ecsh-renewal-open { overflow:hidden; }
628 .ecsh-renewal-card { position:relative; width:560px; max-width:100%; background:#fff; border-radius:14px; box-shadow:0 24px 60px rgba(0,0,0,.3); padding:24px 26px 22px; font-family:inherit; }
629 .ecsh-renewal-x { position:absolute; top:12px; right:12px; width:32px; height:32px; border:0; background:none; border-radius:8px; color:var(--ecsh-g500); cursor:pointer; display:grid; place-items:center; }
630 .ecsh-renewal-x:hover { background:var(--ecsh-g100); color:var(--ecsh-g900); }
631 .ecsh-renewal-head { display:flex; gap:14px; align-items:flex-start; margin-bottom:12px; padding-right:32px; }
632 .ecsh-renewal-icon { width:42px; height:42px; border-radius:50%; display:grid; place-items:center; flex-shrink:0; background:#fef3c7; color:#b45309; }
633 .ecsh-renewal-icon .dashicons { font-size:22px; width:22px; height:22px; }
634 .ecsh-renewal-modal.is-critical .ecsh-renewal-icon, .ecsh-renewal-modal.is-lapsed .ecsh-renewal-icon { background:#fee2e2; color:var(--ecsh-red); }
635 .ecsh-renewal-eyebrow { display:block; font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.4px; color:var(--ecsh-g500); margin-bottom:2px; }
636 .ecsh-renewal-card h3 { margin:0; font-size:18px; font-weight:600; color:var(--ecsh-g900); line-height:1.3; }
637 .ecsh-renewal-lead { margin:0 0 10px; font-size:13.5px; line-height:1.55; color:var(--ecsh-g700); }
638 .ecsh-renewal-stakes { margin:0 0 18px; padding:0; list-style:none; display:grid; gap:6px; }
639 .ecsh-renewal-stakes li { font-size:13px; color:var(--ecsh-g800); display:flex; gap:9px; align-items:flex-start; line-height:1.45; }
640 .ecsh-renewal-stakes li::before { content:""; width:7px; height:7px; border-radius:50%; background:var(--ecsh-amber); margin-top:7px; flex-shrink:0; }
641 .ecsh-renewal-modal.is-critical .ecsh-renewal-stakes li::before, .ecsh-renewal-modal.is-lapsed .ecsh-renewal-stakes li::before { background:var(--ecsh-red); }
642 .ecsh-renewal-card:focus { outline:none; }
643 .ecsh-renewal-actions { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
644 .ecsh-renewal-actions .ecv2-btn { white-space:nowrap; }
645 .ecsh-renewal-actions .ecv2-btn .dashicons { font-size:14px; width:14px; height:14px; }
646 .ecsh-renewal-foot { display:flex; align-items:center; justify-content:space-between; gap:12px; margin-top:12px; padding-top:12px; border-top:1px solid var(--ecsh-g100); }
647 .ecsh-renewal-fine { font-size:11.5px; color:var(--ecsh-g500); line-height:1.45; }
648
649 .ecsh-renewal-free { font-size:12px; color:var(--ecsh-g500); text-decoration:underline; text-underline-offset:2px; }
650 .ecsh-renewal-free:hover { color:var(--ecsh-g800); }
651
652 /* Lapsed gate variant of the renewal popup */
653 .ecsh-renewal-modal.is-gate { background:rgba(17,24,39,.72); backdrop-filter:blur(2px); }
654 .ecsh-renewal-keep { display:flex; gap:8px; align-items:flex-start; margin:0 0 16px; padding:10px 12px; border-radius:8px; background:#ecfdf5; border:1px solid #bbf7d0; font-size:12.5px; color:#166534; line-height:1.5; }
655 .ecsh-renewal-keep .dashicons { color:var(--ecsh-green); flex-shrink:0; font-size:16px; width:16px; height:16px; margin-top:2px; }
656 .ecsh-renewal-later { margin-left:auto; color:var(--ecsh-g600); }
657 .ecsh-renewal-free { white-space:nowrap; flex-shrink:0; }