PluginProbe
Subscriptions for WooCommerce with Stripe Recurring Payments / 1.10.0
Subscriptions for WooCommerce with Stripe Recurring Payments v1.10.0
2.0.0 1.11.2 1.11.1 1.11.0 1.10.9 1.10.8 1.10.7 1.10.6 1.10.5 1.10.4 1.10.3 1.10.2 1.10.1 1.10.0 1.9.6 1.9.5 trunk 1.3.0 1.3.1 1.3.2 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 All 61 releases
subscription / assets / css / admin-components.css

admin-components.css in Subscriptions for WooCommerce with Stripe Recurring Payments 1.10.0, at assets/css/admin-components.css

1,041 lines 24.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /* ==========================================================================
2 WPSubscription Admin Components (prefix: wpsubs-)
3 Design reference: WP SmartPay sp-layout.css
4 ========================================================================== */
5
6 /* --------------------------------------------------------------------------
7 Design tokens
8 -------------------------------------------------------------------------- */
9 :root {
10 --wpsubs-brand: #2271b1;
11 --wpsubs-brand-dark: #135e96;
12 --wpsubs-brand-light: #eef4fb;
13 --wpsubs-brand-ring: rgba(34, 113, 177, 0.2);
14
15 --wpsubs-surface: #ffffff;
16 --wpsubs-surface-muted: #f9fafb;
17 --wpsubs-border: #e5e7eb;
18 --wpsubs-border-strong: #d1d5db;
19
20 --wpsubs-text: #374151;
21 --wpsubs-text-muted: #6b7280;
22 --wpsubs-text-subtle: #9ca3af;
23
24 --wpsubs-radius: 8px;
25 --wpsubs-radius-sm: 5px;
26 --wpsubs-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
27 --wpsubs-shadow-md: 0 4px 16px rgba(0, 0, 0, 0.1), 0 1px 4px rgba(0, 0, 0, 0.06);
28 }
29
30 /* --------------------------------------------------------------------------
31 Page layout wrapper
32 -------------------------------------------------------------------------- */
33 .wpsubs-layout {
34 max-width: 80rem;
35 margin: 0 auto;
36 padding: 24px 0 48px;
37 box-sizing: border-box;
38 }
39
40 /* --------------------------------------------------------------------------
41 Toolbar
42 -------------------------------------------------------------------------- */
43 .wpsubs-toolbar {
44 display: flex;
45 align-items: center;
46 gap: 8px;
47 flex-wrap: wrap;
48 margin-bottom: 16px;
49 }
50
51 .wpsubs-toolbar__spacer {
52 flex: 1;
53 min-width: 8px;
54 }
55
56 /* --------------------------------------------------------------------------
57 Base input
58 -------------------------------------------------------------------------- */
59 .wpsubs-input {
60 display: block;
61 width: 100%;
62 height: 36px;
63 padding: 0 12px;
64 border: 1px solid var(--wpsubs-border) !important;
65 border-radius: var(--wpsubs-radius-sm) !important;
66 background: var(--wpsubs-surface) !important;
67 font-size: 13px !important;
68 font-family: inherit !important;
69 color: var(--wpsubs-text) !important;
70 outline: none !important;
71 box-shadow: none !important;
72 box-sizing: border-box;
73 transition:
74 border-color 0.15s,
75 box-shadow 0.15s;
76 }
77
78 .wpsubs-input:focus {
79 border-color: var(--wpsubs-brand) !important;
80 box-shadow: 0 0 0 3px var(--wpsubs-brand-ring) !important;
81 }
82
83 .wpsubs-input::placeholder {
84 color: var(--wpsubs-text-subtle) !important;
85 }
86
87 .wpsubs-input:disabled {
88 opacity: 0.55;
89 cursor: not-allowed;
90 background: var(--wpsubs-surface-muted) !important;
91 }
92
93 /* --------------------------------------------------------------------------
94 Input with icon (.wpsubs-input-wrap)
95
96 Usage:
97 <div class="wpsubs-input-wrap wpsubs-input-wrap--icon-l">
98 <svg class="wpsubs-input-icon">...</svg>
99 <input class="wpsubs-input">
100 </div>
101
102 Modifiers: --icon-l (icon on left) --icon-r (icon on right)
103 -------------------------------------------------------------------------- */
104 .wpsubs-input-wrap {
105 position: relative;
106 display: inline-flex;
107 align-items: center;
108 width: 100%;
109 }
110
111 .wpsubs-input-wrap .wpsubs-input-icon {
112 position: absolute;
113 top: 50%;
114 transform: translateY(-50%);
115 width: 15px;
116 height: 15px;
117 color: var(--wpsubs-text-subtle);
118 pointer-events: none;
119 flex-shrink: 0;
120 }
121
122 .wpsubs-input-wrap--icon-l .wpsubs-input-icon {
123 left: 10px;
124 }
125 .wpsubs-input-wrap--icon-l .wpsubs-input {
126 padding-left: 34px !important;
127 }
128
129 .wpsubs-input-wrap--icon-r .wpsubs-input-icon {
130 right: 10px;
131 }
132 .wpsubs-input-wrap--icon-r .wpsubs-input {
133 padding-right: 34px !important;
134 }
135
136 /* --------------------------------------------------------------------------
137 Input group (.wpsubs-input-group)
138
139 A flex row that snaps children edge-to-edge with shared borders.
140 Children: .wpsubs-input, .wpsubs-btn, .wpsubs-select, .wpsubs-adv-select
141
142 Usage:
143 <div class="wpsubs-input-group">
144 <input class="wpsubs-input">
145 <button class="wpsubs-btn wpsubs-btn--outline">Search</button>
146 </div>
147 -------------------------------------------------------------------------- */
148 .wpsubs-input-group {
149 display: inline-flex;
150 align-items: stretch;
151 }
152
153 .wpsubs-input-group > .wpsubs-input,
154 .wpsubs-input-group > .wpsubs-btn,
155 .wpsubs-input-group > .wpsubs-select,
156 .wpsubs-input-group > .wpsubs-adv-select > .wpsubs-adv-select__trigger {
157 border-radius: 0 !important;
158 }
159
160 /* Restore radius on first and last direct children */
161 .wpsubs-input-group > :first-child,
162 .wpsubs-input-group > :first-child > .wpsubs-adv-select__trigger {
163 border-top-left-radius: var(--wpsubs-radius-sm) !important;
164 border-bottom-left-radius: var(--wpsubs-radius-sm) !important;
165 }
166
167 .wpsubs-input-group > :last-child,
168 .wpsubs-input-group > :last-child > .wpsubs-adv-select__trigger {
169 border-top-right-radius: var(--wpsubs-radius-sm) !important;
170 border-bottom-right-radius: var(--wpsubs-radius-sm) !important;
171 }
172
173 /* Collapse adjacent borders */
174 .wpsubs-input-group > *:not(:first-child),
175 .wpsubs-input-group > .wpsubs-adv-select:not(:first-child) > .wpsubs-adv-select__trigger {
176 margin-left: -1px;
177 }
178
179 /* Bring focused item to front so its border ring shows fully */
180 .wpsubs-input-group > .wpsubs-input:focus,
181 .wpsubs-input-group > .wpsubs-btn:focus,
182 .wpsubs-input-group > .wpsubs-select:focus,
183 .wpsubs-input-group > .wpsubs-adv-select--open > .wpsubs-adv-select__trigger {
184 position: relative;
185 z-index: 1;
186 }
187
188 /* --------------------------------------------------------------------------
189 Search — convenience wrapper around input-wrap (backward compat kept)
190 -------------------------------------------------------------------------- */
191 .wpsubs-search {
192 min-width: 180px;
193 max-width: 280px;
194 }
195
196 .wpsubs-search .wpsubs-input-wrap {
197 width: 100%;
198 }
199
200 /* --------------------------------------------------------------------------
201 Buttons
202 -------------------------------------------------------------------------- */
203 .wpsubs-btn {
204 display: inline-flex;
205 align-items: center;
206 justify-content: center;
207 gap: 5px;
208 height: 40px;
209 padding: 0 14px;
210 border-radius: var(--wpsubs-radius-sm);
211 font-size: 13px;
212 font-weight: 500;
213 font-family: inherit;
214 cursor: pointer;
215 white-space: nowrap;
216 text-decoration: none;
217 transition:
218 background 0.12s,
219 border-color 0.12s,
220 color 0.12s;
221 border: 1px solid transparent;
222 line-height: 1;
223 vertical-align: middle;
224 box-shadow: none;
225 }
226
227 .wpsubs-btn:focus,
228 .wpsubs-btn:focus-visible,
229 .wpsubs-btn:active {
230 outline: none !important;
231 box-shadow: none !important;
232 border-radius: var(--wpsubs-radius-sm) !important;
233 }
234
235 .wpsubs-btn--outline {
236 background: var(--wpsubs-surface);
237 border-color: var(--wpsubs-border);
238 color: var(--wpsubs-text);
239 }
240
241 .wpsubs-btn--outline:hover {
242 border-color: var(--wpsubs-border-strong);
243 background: var(--wpsubs-surface-muted);
244 color: var(--wpsubs-text);
245 text-decoration: none;
246 }
247
248 .wpsubs-btn--primary {
249 background: var(--wpsubs-brand);
250 border-color: var(--wpsubs-brand);
251 color: #fff;
252 }
253
254 .wpsubs-btn--primary:hover {
255 background: var(--wpsubs-brand-dark);
256 border-color: var(--wpsubs-brand-dark);
257 color: #fff;
258 text-decoration: none;
259 }
260
261 .wpsubs-btn--danger {
262 background: var(--wpsubs-surface);
263 border-color: #fca5a5;
264 color: #dc2626;
265 }
266
267 .wpsubs-btn--danger:hover {
268 background: #fef2f2;
269 border-color: #f87171;
270 color: #b91c1c;
271 text-decoration: none;
272 }
273
274 /* --------------------------------------------------------------------------
275 Advanced Select (wpsubs-adv-select)
276 Drop-in replacement for native <select>. Renders a trigger button that
277 opens a styled dropdown menu. Use wpsubs_render_adv_select() PHP helper.
278 -------------------------------------------------------------------------- */
279 .wpsubs-adv-select {
280 position: relative;
281 display: inline-block;
282 }
283
284 .wpsubs-adv-select__trigger {
285 display: inline-flex;
286 align-items: center;
287 gap: 5px;
288 height: 40px;
289 padding: 0 14px;
290 border-radius: var(--wpsubs-radius-sm);
291 font-size: 13px;
292 font-weight: 500;
293 font-family: inherit;
294 cursor: pointer;
295 white-space: nowrap;
296 background: var(--wpsubs-surface);
297 border: 1px solid var(--wpsubs-border);
298 color: var(--wpsubs-text);
299 transition:
300 background 0.12s,
301 border-color 0.12s;
302 line-height: 1;
303 box-shadow: none;
304 }
305
306 .wpsubs-adv-select__trigger:hover {
307 border-color: var(--wpsubs-border-strong);
308 background: var(--wpsubs-surface-muted);
309 }
310
311 .wpsubs-adv-select__trigger:focus {
312 outline: none;
313 border-color: var(--wpsubs-brand);
314 box-shadow: 0 0 0 3px var(--wpsubs-brand-ring);
315 }
316
317 .wpsubs-adv-select--open .wpsubs-adv-select__trigger {
318 border-color: var(--wpsubs-brand);
319 }
320
321 .wpsubs-adv-select__label {
322 flex: 1;
323 overflow: hidden;
324 text-overflow: ellipsis;
325 white-space: nowrap;
326 }
327
328 .wpsubs-adv-select__chevron {
329 flex-shrink: 0;
330 opacity: 0.55;
331 transition: transform 0.15s;
332 }
333
334 .wpsubs-adv-select--open .wpsubs-adv-select__chevron {
335 transform: rotate(180deg);
336 }
337
338 .wpsubs-adv-select__menu {
339 display: none;
340 position: absolute;
341 top: calc(100% + 4px);
342 min-width: 100%;
343 width: max-content;
344 box-sizing: border-box;
345 background: var(--wpsubs-surface);
346 border: 1px solid var(--wpsubs-border);
347 border-radius: var(--wpsubs-radius);
348 box-shadow: var(--wpsubs-shadow-md);
349 z-index: 9999;
350 padding: 4px;
351 animation: wpsubs-dropdown-in 0.1s ease;
352 }
353
354 /* Align variants */
355 .wpsubs-adv-select--left .wpsubs-adv-select__menu {
356 left: 0;
357 right: auto;
358 }
359 .wpsubs-adv-select--right .wpsubs-adv-select__menu {
360 right: 0;
361 left: auto;
362 }
363
364 /* Default: left-aligned */
365 .wpsubs-adv-select__menu {
366 left: 0;
367 right: auto;
368 }
369
370 .wpsubs-adv-select--open .wpsubs-adv-select__menu {
371 display: block;
372 }
373
374 .wpsubs-adv-select__item {
375 display: flex;
376 align-items: center;
377 gap: 8px;
378 width: 100%;
379 padding: 7px 10px;
380 border-radius: var(--wpsubs-radius-sm);
381 border: none;
382 background: transparent;
383 font-size: 13px;
384 font-family: inherit;
385 color: var(--wpsubs-text);
386 cursor: pointer;
387 text-align: left;
388 text-decoration: none;
389 white-space: nowrap;
390 transition: background 0.1s;
391 box-sizing: border-box;
392 line-height: 1.4;
393 }
394
395 .wpsubs-adv-select__item:hover {
396 background: var(--wpsubs-surface-muted);
397 color: var(--wpsubs-text);
398 text-decoration: none;
399 }
400
401 .wpsubs-adv-select__item[data-disabled] {
402 opacity: 0.45;
403 cursor: not-allowed;
404 }
405
406 .wpsubs-adv-select__item--danger {
407 color: #dc2626;
408 }
409 .wpsubs-adv-select__item--danger:hover {
410 background: #fee2e2;
411 color: #b91c1c;
412 }
413
414 .wpsubs-adv-select__divider {
415 height: 1px;
416 background: var(--wpsubs-border);
417 margin: 4px 0;
418 }
419
420 /* --------------------------------------------------------------------------
421 Select control
422 -------------------------------------------------------------------------- */
423 .wpsubs-select {
424 height: 40px;
425 padding: 0 28px 0 10px;
426 border: 1px solid var(--wpsubs-border) !important;
427 border-radius: var(--wpsubs-radius-sm) !important;
428 background: var(--wpsubs-surface) !important;
429 font-size: 13px !important;
430 font-family: inherit !important;
431 color: var(--wpsubs-text) !important;
432 outline: none !important;
433 box-shadow: none !important;
434 cursor: pointer;
435 appearance: none;
436 -webkit-appearance: none;
437 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2.5'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") !important;
438 background-repeat: no-repeat !important;
439 background-position: right 9px center !important;
440 transition: border-color 0.15s;
441 vertical-align: middle;
442 line-height: 1;
443 }
444
445 .wpsubs-select:focus {
446 border-color: var(--wpsubs-brand) !important;
447 box-shadow: 0 0 0 3px var(--wpsubs-brand-ring) !important;
448 }
449
450 /* --------------------------------------------------------------------------
451 Custom checkbox
452 -------------------------------------------------------------------------- */
453 input[type="checkbox"].wpsubs-checkbox {
454 -webkit-appearance: none !important;
455 appearance: none !important;
456 display: inline-block !important;
457 box-sizing: border-box !important;
458 width: 16px !important;
459 height: 16px !important;
460 min-width: 16px !important;
461 padding: 0 !important;
462 margin: 0 !important;
463 border: 1.5px solid var(--wpsubs-border-strong) !important;
464 border-radius: 4px !important;
465 background: var(--wpsubs-surface) !important;
466 box-shadow: none !important;
467 outline: none !important;
468 cursor: pointer;
469 flex-shrink: 0;
470 vertical-align: middle;
471 transition:
472 background 0.12s,
473 border-color 0.12s;
474 }
475
476 input[type="checkbox"].wpsubs-checkbox:hover {
477 border-color: var(--wpsubs-brand) !important;
478 }
479
480 input[type="checkbox"].wpsubs-checkbox:checked {
481 background-color: var(--wpsubs-brand) !important;
482 border-color: var(--wpsubs-brand) !important;
483 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3 8.5L6.5 12L13 5' stroke='%23ffffff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round' fill='none'/%3E%3C/svg%3E") !important;
484 background-repeat: no-repeat !important;
485 background-position: center !important;
486 }
487
488 /* Suppress WP admin's ::before blue checkmark overlay */
489 input[type="checkbox"].wpsubs-checkbox:checked::before,
490 input[type="checkbox"].wpsubs-checkbox:checked::after {
491 display: none !important;
492 }
493
494 input[type="checkbox"].wpsubs-checkbox:indeterminate {
495 background-color: var(--wpsubs-brand) !important;
496 border-color: var(--wpsubs-brand) !important;
497 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4 8H12' stroke='%23ffffff' stroke-width='2.5' stroke-linecap='round'/%3E%3C/svg%3E") !important;
498 background-repeat: no-repeat !important;
499 background-position: center !important;
500 background-size: 11px 11px !important;
501 }
502
503 input[type="checkbox"].wpsubs-checkbox:indeterminate::before,
504 input[type="checkbox"].wpsubs-checkbox:indeterminate::after {
505 display: none !important;
506 }
507
508 input[type="checkbox"].wpsubs-checkbox:focus {
509 outline: none !important;
510 box-shadow:
511 0 0 0 2px #fff,
512 0 0 0 4px var(--wpsubs-brand) !important;
513 }
514
515 /* --------------------------------------------------------------------------
516 Table card (white card wrapping table + footer)
517 -------------------------------------------------------------------------- */
518 .wpsubs-table-card {
519 background: var(--wpsubs-surface);
520 border: 1px solid var(--wpsubs-border);
521 border-radius: var(--wpsubs-radius);
522 }
523
524 /* --------------------------------------------------------------------------
525 Table
526 -------------------------------------------------------------------------- */
527 .wpsubs-table {
528 width: 100%;
529 border-collapse: separate;
530 border-spacing: 0;
531 font-size: 13.5px;
532 margin: 0;
533 }
534
535 /* Header */
536 .wpsubs-table thead {
537 background: var(--wpsubs-surface-muted);
538 }
539
540 .wpsubs-table thead th {
541 padding: 13px 18px;
542 text-align: left;
543 font-size: 11px;
544 font-weight: 600;
545 color: var(--wpsubs-text-muted);
546 text-transform: uppercase;
547 letter-spacing: 0.07em;
548 white-space: nowrap;
549 background: transparent;
550 border: none;
551 border-bottom: 1px solid var(--wpsubs-border);
552 box-shadow: none;
553 vertical-align: middle;
554 }
555
556 /* Round the thead top corners so they follow the card's border-radius */
557 .wpsubs-table thead tr:first-child th:first-child {
558 border-top-left-radius: calc(var(--wpsubs-radius) - 1px);
559 }
560 .wpsubs-table thead tr:first-child th:last-child {
561 border-top-right-radius: calc(var(--wpsubs-radius) - 1px);
562 }
563
564 /* Column modifiers */
565 .wpsubs-col--check {
566 width: 20px !important;
567 padding-right: 4px !important;
568 }
569 .wpsubs-col--actions {
570 width: 44px;
571 text-align: right !important;
572 }
573 .wpsubs-col--nowrap {
574 white-space: nowrap;
575 }
576
577 /* Body rows */
578 .wpsubs-table tbody tr {
579 transition: background 0.1s;
580 background: transparent;
581 }
582
583 .wpsubs-table tbody tr:hover {
584 background: var(--wpsubs-surface-muted);
585 }
586
587 .wpsubs-table tbody tr.wpsubs-row--selected {
588 background: var(--wpsubs-brand-light);
589 }
590
591 /* Cells — border on td instead of tr (required for border-collapse: separate) */
592 .wpsubs-table td {
593 padding: 18px;
594 color: var(--wpsubs-text);
595 vertical-align: middle;
596 border: none;
597 border-bottom: 1px solid var(--wpsubs-border);
598 box-shadow: none;
599 }
600
601 .wpsubs-table tbody tr:last-child td {
602 border-bottom: none;
603 }
604
605 .wpsubs-table td.wpsubs-col--check {
606 padding-right: 4px;
607 }
608
609 .wpsubs-table td.wpsubs-cell--muted {
610 color: var(--wpsubs-text-muted);
611 font-size: 12.5px;
612 }
613
614 .wpsubs-table td.wpsubs-cell--actions {
615 width: 1%;
616 white-space: nowrap;
617 padding: 0 10px 0 4px;
618 }
619
620 /* --------------------------------------------------------------------------
621 Avatar — light bg + dark text, 8 deterministic colors
622 -------------------------------------------------------------------------- */
623 .wpsubs-customer {
624 display: flex;
625 align-items: center;
626 gap: 10px;
627 min-width: 0;
628 }
629
630 .wpsubs-customer__info {
631 min-width: 0;
632 }
633
634 .wpsubs-customer__name {
635 font-weight: 400;
636 color: var(--wpsubs-text);
637 font-size: 13.5px;
638 line-height: 1.3;
639 white-space: nowrap;
640 overflow: hidden;
641 text-overflow: ellipsis;
642 text-decoration: none;
643 display: block;
644 }
645
646 a.wpsubs-customer__name:hover {
647 color: var(--wpsubs-brand);
648 text-decoration: none;
649 }
650
651 .wpsubs-customer__sub {
652 font-size: 12px;
653 color: var(--wpsubs-text-muted);
654 line-height: 1.3;
655 white-space: nowrap;
656 overflow: hidden;
657 text-overflow: ellipsis;
658 display: block;
659 }
660
661 .wpsubs-avatar {
662 width: 36px;
663 height: 36px;
664 border-radius: 50%;
665 display: flex;
666 align-items: center;
667 justify-content: center;
668 font-size: 11px;
669 font-weight: 700;
670 flex-shrink: 0;
671 text-transform: uppercase;
672 letter-spacing: 0.03em;
673 user-select: none;
674 background: var(--wpsubs-surface-muted);
675 color: var(--wpsubs-text-muted);
676 }
677
678 .wpsubs-avatar[data-color="0"] {
679 background: #dbeafe;
680 color: #1d4ed8;
681 }
682 .wpsubs-avatar[data-color="1"] {
683 background: #d1fae5;
684 color: #065f46;
685 }
686 .wpsubs-avatar[data-color="2"] {
687 background: #fce7f3;
688 color: #9d174d;
689 }
690 .wpsubs-avatar[data-color="3"] {
691 background: #e0e7ff;
692 color: #4338ca;
693 }
694 .wpsubs-avatar[data-color="4"] {
695 background: #fef3c7;
696 color: #92400e;
697 }
698 .wpsubs-avatar[data-color="5"] {
699 background: #fee2e2;
700 color: #991b1b;
701 }
702 .wpsubs-avatar[data-color="6"] {
703 background: #f3e8ff;
704 color: #6b21a8;
705 }
706 .wpsubs-avatar[data-color="7"] {
707 background: #ccfbf1;
708 color: #134e4a;
709 }
710
711 /* --------------------------------------------------------------------------
712 Cell: product title + id below
713 -------------------------------------------------------------------------- */
714 .wpsubs-cell-title {
715 font-weight: 400;
716 color: var(--wpsubs-text);
717 font-size: 13.5px;
718 line-height: 1.3;
719 white-space: nowrap;
720 overflow: hidden;
721 text-overflow: ellipsis;
722 text-decoration: none;
723 display: block;
724 }
725
726 a.wpsubs-cell-title:hover {
727 color: var(--wpsubs-brand);
728 text-decoration: none;
729 }
730
731 .wpsubs-cell-id {
732 font-size: 12px;
733 color: var(--wpsubs-text-muted);
734 line-height: 1.3;
735 display: block;
736 }
737
738 /* --------------------------------------------------------------------------
739 Status badge with dot
740 -------------------------------------------------------------------------- */
741 .wpsubs-badge {
742 display: inline-flex;
743 align-items: center;
744 gap: 5px;
745 padding: 2px 10px;
746 border-radius: 9999px;
747 font-size: 12px;
748 font-weight: 500;
749 white-space: nowrap;
750 line-height: 1.6;
751 border: 1px solid transparent;
752 }
753
754 .wpsubs-badge__dot {
755 width: 6px;
756 height: 6px;
757 border-radius: 50%;
758 flex-shrink: 0;
759 }
760
761 .wpsubs-badge--active {
762 background: #dcfce7;
763 color: #15803d;
764 border-color: #bbf7d0;
765 }
766 .wpsubs-badge--active .wpsubs-badge__dot {
767 background: #16a34a;
768 }
769
770 .wpsubs-badge--pending {
771 background: #eff6ff;
772 color: #1d4ed8;
773 border-color: #bfdbfe;
774 }
775 .wpsubs-badge--pending .wpsubs-badge__dot {
776 background: #3b82f6;
777 }
778
779 .wpsubs-badge--pending-cancel {
780 background: #fefce8;
781 color: #854d0e;
782 border-color: #fde68a;
783 }
784 .wpsubs-badge--pending-cancel .wpsubs-badge__dot {
785 background: #ca8a04;
786 }
787
788 .wpsubs-badge--cancelled {
789 background: #f3f4f6;
790 color: #4b5563;
791 border-color: #e5e7eb;
792 }
793 .wpsubs-badge--cancelled .wpsubs-badge__dot {
794 background: #9ca3af;
795 }
796
797 .wpsubs-badge--expired,
798 .wpsubs-badge--draft {
799 background: #fee2e2;
800 color: #991b1b;
801 border-color: #fca5a5;
802 }
803 .wpsubs-badge--expired .wpsubs-badge__dot,
804 .wpsubs-badge--draft .wpsubs-badge__dot {
805 background: #dc2626;
806 }
807
808 .wpsubs-badge--trash {
809 background: #fee2e2;
810 color: #991b1b;
811 border-color: #fca5a5;
812 }
813 .wpsubs-badge--trash .wpsubs-badge__dot {
814 background: #ef4444;
815 }
816
817 /* --------------------------------------------------------------------------
818 Row actions (three-dot dropdown)
819 -------------------------------------------------------------------------- */
820 .wpsubs-row-actions {
821 position: relative;
822 display: flex;
823 justify-content: flex-end;
824 }
825
826 .wpsubs-row-actions__trigger {
827 display: flex;
828 align-items: center;
829 justify-content: center;
830 width: 30px;
831 height: 30px;
832 border-radius: var(--wpsubs-radius-sm);
833 border: none;
834 background: transparent;
835 cursor: pointer;
836 color: var(--wpsubs-text-subtle);
837 transition:
838 background 0.12s,
839 color 0.12s;
840 padding: 0;
841 font-size: 18px;
842 letter-spacing: 1px;
843 line-height: 1;
844 }
845
846 .wpsubs-row-actions__trigger:hover,
847 .wpsubs-row-actions--open .wpsubs-row-actions__trigger {
848 background: var(--wpsubs-surface-muted);
849 color: var(--wpsubs-text);
850 outline: none;
851 }
852
853 @keyframes wpsubs-dropdown-in {
854 from {
855 opacity: 0;
856 transform: translateY(-4px);
857 }
858 to {
859 opacity: 1;
860 transform: translateY(0);
861 }
862 }
863
864 .wpsubs-dropdown {
865 display: none;
866 position: absolute;
867 right: 0;
868 top: calc(100% + 4px);
869 width: max-content;
870 box-sizing: border-box;
871 background: var(--wpsubs-surface);
872 border: 1px solid var(--wpsubs-border);
873 border-radius: var(--wpsubs-radius);
874 box-shadow: var(--wpsubs-shadow-md);
875 z-index: 9999;
876 padding: 4px;
877 }
878
879 .wpsubs-dropdown--open {
880 display: block;
881 animation: wpsubs-dropdown-in 0.1s ease;
882 }
883
884 .wpsubs-dropdown__item {
885 display: flex;
886 align-items: center;
887 gap: 8px;
888 width: 100%;
889 padding: 7px 10px;
890 border-radius: var(--wpsubs-radius-sm);
891 border: none;
892 background: transparent;
893 font-size: 13px;
894 font-family: inherit;
895 color: var(--wpsubs-text);
896 cursor: pointer;
897 text-align: left;
898 text-decoration: none;
899 white-space: nowrap;
900 transition: background 0.1s;
901 box-sizing: border-box;
902 line-height: 1.4;
903 }
904
905 .wpsubs-dropdown__item:hover {
906 background: var(--wpsubs-surface-muted);
907 color: var(--wpsubs-text);
908 text-decoration: none;
909 }
910
911 .wpsubs-dropdown__item:disabled {
912 color: var(--wpsubs-text-subtle);
913 cursor: not-allowed;
914 }
915
916 .wpsubs-dropdown__item--danger {
917 color: #dc2626;
918 }
919 .wpsubs-dropdown__item--danger:hover {
920 background: #fee2e2;
921 color: #b91c1c;
922 }
923
924 .wpsubs-dropdown__divider {
925 height: 1px;
926 background: var(--wpsubs-border);
927 margin: 4px 0;
928 }
929
930 /* --------------------------------------------------------------------------
931 Pagination footer (inside table card)
932 -------------------------------------------------------------------------- */
933 .wpsubs-pagination {
934 display: flex;
935 align-items: center;
936 justify-content: space-between;
937 padding: 12px 16px;
938 border-top: 1px solid var(--wpsubs-border);
939 flex-wrap: wrap;
940 gap: 8px;
941 }
942
943 .wpsubs-pagination__info {
944 font-size: 12.5px;
945 color: var(--wpsubs-text-muted);
946 }
947
948 .wpsubs-pagination__nav {
949 display: flex;
950 align-items: center;
951 gap: 4px;
952 }
953
954 .wpsubs-pagination__btn {
955 display: inline-flex;
956 align-items: center;
957 justify-content: center;
958 width: 26px;
959 height: 26px;
960 padding: 0;
961 border: 1px solid var(--wpsubs-border);
962 border-radius: var(--wpsubs-radius-sm);
963 background: var(--wpsubs-surface);
964 cursor: pointer;
965 font-size: 12px;
966 font-weight: 500;
967 color: var(--wpsubs-text-muted);
968 transition:
969 border-color 0.12s,
970 color 0.12s,
971 background 0.12s;
972 text-decoration: none;
973 line-height: 1;
974 flex-shrink: 0;
975 }
976
977 .wpsubs-pagination__btn:hover {
978 border-color: var(--wpsubs-brand);
979 color: var(--wpsubs-brand);
980 text-decoration: none;
981 }
982
983 .wpsubs-pagination__btn--disabled {
984 opacity: 0.35;
985 cursor: not-allowed;
986 pointer-events: none;
987 }
988
989 .wpsubs-pagination__btn--active {
990 background: var(--wpsubs-brand);
991 border-color: var(--wpsubs-brand);
992 color: #fff;
993 font-weight: 600;
994 cursor: default;
995 pointer-events: none;
996 }
997
998 .wpsubs-pagination__ellipsis {
999 display: inline-flex;
1000 align-items: center;
1001 justify-content: center;
1002 width: 26px;
1003 height: 26px;
1004 font-size: 12px;
1005 color: var(--wpsubs-text-subtle);
1006 user-select: none;
1007 }
1008
1009 /* --------------------------------------------------------------------------
1010 Empty state
1011 -------------------------------------------------------------------------- */
1012 .wpsubs-empty {
1013 display: flex;
1014 flex-direction: column;
1015 align-items: center;
1016 justify-content: center;
1017 padding: 64px 24px;
1018 text-align: center;
1019 }
1020
1021 .wpsubs-empty__icon {
1022 font-size: 2.5rem;
1023 margin-bottom: 14px;
1024 opacity: 0.45;
1025 line-height: 1;
1026 }
1027
1028 .wpsubs-empty__title {
1029 font-size: 15px;
1030 font-weight: 600;
1031 color: var(--wpsubs-text);
1032 margin: 0 0 6px;
1033 }
1034
1035 .wpsubs-empty__desc {
1036 font-size: 13px;
1037 color: var(--wpsubs-text-muted);
1038 margin: 0;
1039 line-height: 1.6;
1040 }
1041