PluginProbe
Subscriptions for WooCommerce with Stripe Recurring Payments / 1.10.4
Subscriptions for WooCommerce with Stripe Recurring Payments v1.10.4
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.4, at assets/css/admin-components.css

1,607 lines 37.6 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: #ff4d00;
11 --wpsubs-brand-dark: #d93f00;
12 --wpsubs-brand-light: #fff1eb;
13 --wpsubs-brand-ring: rgba(255, 77, 0, 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 min-height: 36px !important;
64 padding: 0 12px;
65 border: 1px solid var(--wpsubs-border) !important;
66 border-radius: var(--wpsubs-radius-sm) !important;
67 background: var(--wpsubs-surface) !important;
68 font-size: 13px !important;
69 font-family: inherit !important;
70 color: var(--wpsubs-text) !important;
71 outline: none !important;
72 box-shadow: none !important;
73 box-sizing: border-box;
74 transition:
75 border-color 0.15s,
76 box-shadow 0.15s;
77 }
78
79 .wpsubs-input:focus {
80 border-color: var(--wpsubs-brand) !important;
81 box-shadow: 0 0 0 3px var(--wpsubs-brand-ring) !important;
82 }
83
84 .wpsubs-input::placeholder {
85 color: var(--wpsubs-text-subtle) !important;
86 }
87
88 .wpsubs-input:disabled {
89 opacity: 0.55;
90 cursor: not-allowed;
91 background: var(--wpsubs-surface-muted) !important;
92 }
93
94 /* --------------------------------------------------------------------------
95 Input with icon (.wpsubs-input-wrap)
96
97 Usage:
98 <div class="wpsubs-input-wrap wpsubs-input-wrap--icon-l">
99 <svg class="wpsubs-input-icon">...</svg>
100 <input class="wpsubs-input">
101 </div>
102
103 Modifiers: --icon-l (icon on left) --icon-r (icon on right)
104 -------------------------------------------------------------------------- */
105 .wpsubs-input-wrap {
106 position: relative;
107 display: inline-flex;
108 align-items: center;
109 width: 100%;
110 }
111
112 .wpsubs-input-wrap .wpsubs-input-icon {
113 position: absolute;
114 top: 50%;
115 transform: translateY(-50%);
116 width: 15px;
117 height: 15px;
118 color: var(--wpsubs-text-subtle);
119 pointer-events: none;
120 flex-shrink: 0;
121 }
122
123 .wpsubs-input-wrap--icon-l .wpsubs-input-icon {
124 left: 10px;
125 }
126 .wpsubs-input-wrap--icon-l .wpsubs-input {
127 padding-left: 34px !important;
128 }
129
130 .wpsubs-input-wrap--icon-r .wpsubs-input-icon {
131 right: 10px;
132 }
133 .wpsubs-input-wrap--icon-r .wpsubs-input {
134 padding-right: 34px !important;
135 }
136
137 /* --------------------------------------------------------------------------
138 Input group (.wpsubs-input-group)
139
140 A flex row that snaps children edge-to-edge with shared borders.
141 Children: .wpsubs-input, .wpsubs-btn, .wpsubs-select, .wpsubs-adv-select
142
143 Usage:
144 <div class="wpsubs-input-group">
145 <input class="wpsubs-input">
146 <button class="wpsubs-btn wpsubs-btn--outline">Search</button>
147 </div>
148 -------------------------------------------------------------------------- */
149 .wpsubs-input-group {
150 display: inline-flex;
151 align-items: stretch;
152 }
153
154 .wpsubs-input-group > .wpsubs-input,
155 .wpsubs-input-group > .wpsubs-btn,
156 .wpsubs-input-group > .wpsubs-tooltip > .wpsubs-btn,
157 .wpsubs-input-group > .wpsubs-select,
158 .wpsubs-input-group > .wpsubs-adv-select > .wpsubs-adv-select__trigger {
159 border-radius: 0 !important;
160 }
161
162 /* Normalise button height to match input height inside a group */
163 .wpsubs-input-group > .wpsubs-btn,
164 .wpsubs-input-group > .wpsubs-tooltip > .wpsubs-btn {
165 height: 36px;
166 }
167
168 /* Restore radius on first and last direct children */
169 .wpsubs-input-group > :first-child,
170 .wpsubs-input-group > :first-child > .wpsubs-adv-select__trigger {
171 border-top-left-radius: var(--wpsubs-radius-sm) !important;
172 border-bottom-left-radius: var(--wpsubs-radius-sm) !important;
173 }
174
175 .wpsubs-input-group > :last-child,
176 .wpsubs-input-group > :last-child > .wpsubs-adv-select__trigger,
177 .wpsubs-input-group > :last-child > .wpsubs-btn {
178 border-top-right-radius: var(--wpsubs-radius-sm) !important;
179 border-bottom-right-radius: var(--wpsubs-radius-sm) !important;
180 }
181
182 /* Collapse adjacent borders */
183 .wpsubs-input-group > *:not(:first-child),
184 .wpsubs-input-group > .wpsubs-adv-select:not(:first-child) > .wpsubs-adv-select__trigger {
185 margin-left: -1px;
186 }
187
188 /* Bring focused item to front so its border ring shows fully */
189 .wpsubs-input-group > .wpsubs-input:focus,
190 .wpsubs-input-group > .wpsubs-btn:focus,
191 .wpsubs-input-group > .wpsubs-tooltip > .wpsubs-btn:focus,
192 .wpsubs-input-group > .wpsubs-select:focus,
193 .wpsubs-input-group > .wpsubs-adv-select--open > .wpsubs-adv-select__trigger {
194 position: relative;
195 z-index: 1;
196 }
197
198 /* --------------------------------------------------------------------------
199 Search — convenience wrapper around input-wrap (backward compat kept)
200 -------------------------------------------------------------------------- */
201 .wpsubs-search {
202 min-width: 180px;
203 max-width: 280px;
204 }
205
206 .wpsubs-search .wpsubs-input-wrap {
207 width: 100%;
208 }
209
210 /* --------------------------------------------------------------------------
211 Buttons
212 -------------------------------------------------------------------------- */
213 .wpsubs-btn {
214 display: inline-flex;
215 align-items: center;
216 justify-content: center;
217 gap: 5px;
218 height: 36px;
219 padding: 0 14px;
220 border-radius: var(--wpsubs-radius-sm);
221 font-size: 13px;
222 font-weight: 500;
223 font-family: inherit;
224 cursor: pointer;
225 white-space: nowrap;
226 text-decoration: none;
227 transition:
228 background 0.12s,
229 border-color 0.12s,
230 color 0.12s;
231 border: 1px solid transparent;
232 line-height: 1;
233 vertical-align: middle;
234 box-shadow: none;
235 }
236
237 .wpsubs-btn:focus,
238 .wpsubs-btn:focus-visible,
239 .wpsubs-btn:active {
240 outline: none !important;
241 box-shadow: none !important;
242 border-radius: var(--wpsubs-radius-sm) !important;
243 }
244
245 .wpsubs-btn--outline {
246 background: var(--wpsubs-surface);
247 border-color: var(--wpsubs-border);
248 color: var(--wpsubs-text);
249 }
250
251 .wpsubs-btn--outline:hover {
252 border-color: var(--wpsubs-border-strong);
253 background: var(--wpsubs-surface-muted);
254 color: var(--wpsubs-text);
255 text-decoration: none;
256 }
257
258 .wpsubs-btn--primary {
259 background: var(--wpsubs-brand);
260 border-color: var(--wpsubs-brand);
261 color: #fff;
262 }
263
264 .wpsubs-btn--primary:hover {
265 background: var(--wpsubs-brand-dark);
266 border-color: var(--wpsubs-brand-dark);
267 color: #fff;
268 text-decoration: none;
269 }
270
271 /* Icon-only square button */
272 .wpsubs-btn--icon {
273 width: 36px;
274 height: 36px;
275 padding: 0;
276 flex-shrink: 0;
277 }
278
279 .wpsubs-btn--sm {
280 height: 30px;
281 padding: 0 10px;
282 font-size: 12px;
283 }
284
285 /* --------------------------------------------------------------------------
286 Tooltip (wpsubs-tooltip)
287 CSS-only. Wrap any element with .wpsubs-tooltip and set data-tip="text".
288 -------------------------------------------------------------------------- */
289 .wpsubs-tooltip {
290 position: relative;
291 display: inline-flex;
292 }
293
294 .wpsubs-tooltip::after {
295 content: attr(data-tip);
296 position: absolute;
297 bottom: calc(100% + 6px);
298 left: 50%;
299 transform: translateX(-50%);
300 background: #1f2937;
301 color: #fff;
302 font-size: 12px;
303 font-weight: 400;
304 font-family: inherit;
305 line-height: 1.4;
306 padding: 5px 9px;
307 border-radius: 5px;
308 white-space: nowrap;
309 pointer-events: none;
310 opacity: 0;
311 transition: opacity 0.15s;
312 z-index: 9999;
313 }
314
315 /* Arrow — base sits 4px inside the element so tip meets bubble bottom edge exactly */
316 .wpsubs-tooltip::before {
317 content: "";
318 position: absolute;
319 bottom: calc(100% - 4px);
320 left: 50%;
321 transform: translateX(-50%);
322 border: 5px solid transparent;
323 border-top-color: #1f2937;
324 pointer-events: none;
325 opacity: 0;
326 transition: opacity 0.15s;
327 z-index: 9999;
328 }
329
330 .wpsubs-tooltip:hover::after,
331 .wpsubs-tooltip:hover::before {
332 opacity: 1;
333 }
334
335 /* Placement variants */
336 .wpsubs-tooltip--bottom::after {
337 bottom: auto;
338 top: calc(100% + 6px);
339 }
340
341 .wpsubs-tooltip--bottom::before {
342 bottom: auto;
343 top: calc(100% - 4px);
344 border-top-color: transparent;
345 border-bottom-color: #1f2937;
346 }
347
348 .wpsubs-btn--danger {
349 background: var(--wpsubs-surface);
350 border-color: #fca5a5;
351 color: #dc2626;
352 }
353
354 .wpsubs-btn--danger:hover {
355 background: #fef2f2;
356 border-color: #f87171;
357 color: #b91c1c;
358 text-decoration: none;
359 }
360
361 /* --------------------------------------------------------------------------
362 Advanced Select (wpsubs-adv-select)
363 Drop-in replacement for native <select>. Renders a trigger button that
364 opens a styled dropdown menu. Use wpsubs_render_adv_select() PHP helper.
365 -------------------------------------------------------------------------- */
366 .wpsubs-adv-select {
367 position: relative;
368 display: inline-block;
369 }
370
371 .wpsubs-adv-select__trigger {
372 display: inline-flex;
373 align-items: center;
374 gap: 5px;
375 height: 36px;
376 width: 100%;
377 min-width: max-content;
378 padding: 0 14px;
379 border-radius: var(--wpsubs-radius-sm);
380 font-size: 13px;
381 font-weight: 500;
382 font-family: inherit;
383 cursor: pointer;
384 white-space: nowrap;
385 text-align: left;
386 background: var(--wpsubs-surface);
387 border: 1px solid var(--wpsubs-border);
388 color: var(--wpsubs-text);
389 transition:
390 background 0.12s,
391 border-color 0.12s;
392 line-height: 1;
393 box-shadow: none;
394 }
395
396 .wpsubs-adv-select__trigger:hover {
397 border-color: var(--wpsubs-border-strong);
398 background: var(--wpsubs-surface-muted);
399 }
400
401 .wpsubs-adv-select__trigger:focus {
402 outline: none;
403 border-color: var(--wpsubs-brand);
404 box-shadow: 0 0 0 3px var(--wpsubs-brand-ring);
405 }
406
407 .wpsubs-adv-select--open .wpsubs-adv-select__trigger {
408 border-color: var(--wpsubs-brand);
409 }
410
411 .wpsubs-adv-select__label {
412 flex: 1;
413 overflow: hidden;
414 text-overflow: ellipsis;
415 white-space: nowrap;
416 }
417
418 .wpsubs-adv-select__chevron {
419 flex-shrink: 0;
420 opacity: 0.55;
421 transition: transform 0.15s;
422 }
423
424 .wpsubs-adv-select--open .wpsubs-adv-select__chevron {
425 transform: rotate(180deg);
426 }
427
428 .wpsubs-adv-select__menu {
429 display: none;
430 position: absolute;
431 top: calc(100% + 4px);
432 min-width: 100%;
433 width: max-content;
434 box-sizing: border-box;
435 background: var(--wpsubs-surface);
436 border: 1px solid var(--wpsubs-border);
437 border-radius: var(--wpsubs-radius);
438 box-shadow: var(--wpsubs-shadow-md);
439 z-index: 9999;
440 padding: 4px;
441 animation: wpsubs-dropdown-in 0.1s ease;
442 }
443
444 /* Align variants */
445 .wpsubs-adv-select--left .wpsubs-adv-select__menu {
446 left: 0;
447 right: auto;
448 }
449 .wpsubs-adv-select--right .wpsubs-adv-select__menu {
450 right: 0;
451 left: auto;
452 }
453
454 /* Default: left-aligned */
455 .wpsubs-adv-select__menu {
456 left: 0;
457 right: auto;
458 }
459
460 .wpsubs-adv-select--open .wpsubs-adv-select__menu {
461 display: block;
462 }
463
464 .wpsubs-adv-select__item {
465 display: flex;
466 align-items: center;
467 gap: 8px;
468 width: 100%;
469 padding: 7px 10px;
470 border-radius: var(--wpsubs-radius-sm);
471 border: none;
472 background: transparent;
473 font-size: 13px;
474 font-family: inherit;
475 color: var(--wpsubs-text);
476 cursor: pointer;
477 text-align: left;
478 text-decoration: none;
479 white-space: nowrap;
480 transition: background 0.1s;
481 box-sizing: border-box;
482 line-height: 1.4;
483 }
484
485 .wpsubs-adv-select__item:hover {
486 background: var(--wpsubs-surface-muted);
487 color: var(--wpsubs-text);
488 text-decoration: none;
489 }
490
491 .wpsubs-adv-select__item[data-disabled] {
492 opacity: 0.45;
493 cursor: not-allowed;
494 }
495
496 .wpsubs-adv-select__item--danger {
497 color: #dc2626;
498 }
499 .wpsubs-adv-select__item--danger:hover {
500 background: #fee2e2;
501 color: #b91c1c;
502 }
503
504 .wpsubs-adv-select__divider {
505 height: 1px;
506 background: var(--wpsubs-border);
507 margin: 4px 0;
508 }
509
510 /* --------------------------------------------------------------------------
511 Select control
512 -------------------------------------------------------------------------- */
513 .wpsubs-select {
514 height: 36px;
515 padding: 0 28px 0 10px;
516 border: 1px solid var(--wpsubs-border) !important;
517 border-radius: var(--wpsubs-radius-sm) !important;
518 background: var(--wpsubs-surface) !important;
519 font-size: 13px !important;
520 font-family: inherit !important;
521 color: var(--wpsubs-text) !important;
522 outline: none !important;
523 box-shadow: none !important;
524 cursor: pointer;
525 appearance: none;
526 -webkit-appearance: none;
527 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;
528 background-repeat: no-repeat !important;
529 background-position: right 9px center !important;
530 transition: border-color 0.15s;
531 vertical-align: middle;
532 line-height: 1;
533 }
534
535 .wpsubs-select:focus {
536 border-color: var(--wpsubs-brand) !important;
537 box-shadow: 0 0 0 3px var(--wpsubs-brand-ring) !important;
538 }
539
540 /* --------------------------------------------------------------------------
541 Custom checkbox
542 -------------------------------------------------------------------------- */
543 input[type="checkbox"].wpsubs-checkbox {
544 -webkit-appearance: none !important;
545 appearance: none !important;
546 display: inline-block !important;
547 box-sizing: border-box !important;
548 width: 16px !important;
549 height: 16px !important;
550 min-width: 16px !important;
551 padding: 0 !important;
552 margin: 0 !important;
553 border: 1.5px solid var(--wpsubs-border-strong) !important;
554 border-radius: 4px !important;
555 background: var(--wpsubs-surface) !important;
556 box-shadow: none !important;
557 outline: none !important;
558 cursor: pointer;
559 flex-shrink: 0;
560 vertical-align: middle;
561 transition:
562 background 0.12s,
563 border-color 0.12s;
564 }
565
566 input[type="checkbox"].wpsubs-checkbox:hover {
567 border-color: var(--wpsubs-brand) !important;
568 }
569
570 input[type="checkbox"].wpsubs-checkbox:checked {
571 background-color: var(--wpsubs-brand) !important;
572 border-color: var(--wpsubs-brand) !important;
573 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;
574 background-repeat: no-repeat !important;
575 background-position: center !important;
576 }
577
578 /* Suppress WP admin's ::before blue checkmark overlay */
579 input[type="checkbox"].wpsubs-checkbox:checked::before,
580 input[type="checkbox"].wpsubs-checkbox:checked::after {
581 display: none !important;
582 }
583
584 input[type="checkbox"].wpsubs-checkbox:indeterminate {
585 background-color: var(--wpsubs-brand) !important;
586 border-color: var(--wpsubs-brand) !important;
587 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;
588 background-repeat: no-repeat !important;
589 background-position: center !important;
590 background-size: 11px 11px !important;
591 }
592
593 input[type="checkbox"].wpsubs-checkbox:indeterminate::before,
594 input[type="checkbox"].wpsubs-checkbox:indeterminate::after {
595 display: none !important;
596 }
597
598 input[type="checkbox"].wpsubs-checkbox:focus {
599 outline: none !important;
600 box-shadow:
601 0 0 0 2px #fff,
602 0 0 0 4px var(--wpsubs-brand) !important;
603 }
604
605 /* --------------------------------------------------------------------------
606 Table card (white card wrapping table + footer)
607 -------------------------------------------------------------------------- */
608 .wpsubs-table-card {
609 background: var(--wpsubs-surface);
610 border: 1px solid var(--wpsubs-border);
611 border-radius: var(--wpsubs-radius);
612 }
613
614 /* --------------------------------------------------------------------------
615 Table
616 -------------------------------------------------------------------------- */
617 .wpsubs-table {
618 width: 100%;
619 border-collapse: separate;
620 border-spacing: 0;
621 font-size: 13.5px;
622 margin: 0;
623 }
624
625 /* Header */
626 .wpsubs-table thead {
627 background: var(--wpsubs-surface-muted);
628 }
629
630 .wpsubs-table thead th {
631 padding: 13px 18px;
632 text-align: left;
633 font-size: 11px;
634 font-weight: 600;
635 color: var(--wpsubs-text-muted);
636 text-transform: uppercase;
637 letter-spacing: 0.07em;
638 white-space: nowrap;
639 background: transparent;
640 border: none;
641 border-bottom: 1px solid var(--wpsubs-border);
642 box-shadow: none;
643 vertical-align: middle;
644 }
645
646 /* Round the thead top corners so they follow the card's border-radius */
647 .wpsubs-table thead tr:first-child th:first-child {
648 border-top-left-radius: calc(var(--wpsubs-radius) - 1px);
649 }
650 .wpsubs-table thead tr:first-child th:last-child {
651 border-top-right-radius: calc(var(--wpsubs-radius) - 1px);
652 }
653
654 /* Column modifiers */
655 .wpsubs-col--check {
656 width: 20px !important;
657 padding-right: 4px !important;
658 }
659 .wpsubs-col--actions {
660 width: 44px;
661 text-align: right !important;
662 }
663 .wpsubs-col--nowrap {
664 white-space: nowrap;
665 }
666
667 /* Body rows */
668 .wpsubs-table tbody tr {
669 transition: background 0.1s;
670 background: transparent;
671 }
672
673 .wpsubs-table tbody tr:hover {
674 background: var(--wpsubs-surface-muted);
675 }
676
677 .wpsubs-table tbody tr.wpsubs-row--selected {
678 background: var(--wpsubs-brand-light);
679 }
680
681 /* Cells — border on td instead of tr (required for border-collapse: separate) */
682 .wpsubs-table td {
683 padding: 18px;
684 color: var(--wpsubs-text);
685 vertical-align: middle;
686 border: none;
687 border-bottom: 1px solid var(--wpsubs-border);
688 box-shadow: none;
689 }
690
691 .wpsubs-table tbody tr:last-child td {
692 border-bottom: none;
693 }
694
695 .wpsubs-table td.wpsubs-col--check {
696 padding-right: 4px;
697 }
698
699 .wpsubs-table td.wpsubs-cell--muted {
700 color: var(--wpsubs-text-muted);
701 font-size: 12.5px;
702 }
703
704 .wpsubs-table td.wpsubs-cell--actions {
705 width: 1%;
706 white-space: nowrap;
707 padding: 0 10px 0 4px;
708 }
709
710 /* --------------------------------------------------------------------------
711 Avatar — light bg + dark text, 8 deterministic colors
712 -------------------------------------------------------------------------- */
713 .wpsubs-customer {
714 display: flex;
715 align-items: center;
716 gap: 10px;
717 min-width: 0;
718 }
719
720 .wpsubs-customer__info {
721 min-width: 0;
722 }
723
724 .wpsubs-customer__name {
725 font-weight: 400;
726 color: var(--wpsubs-text);
727 font-size: 13.5px;
728 line-height: 1.3;
729 white-space: nowrap;
730 overflow: hidden;
731 text-overflow: ellipsis;
732 text-decoration: none;
733 display: block;
734 }
735
736 a.wpsubs-customer__name:hover {
737 color: var(--wpsubs-brand);
738 text-decoration: none;
739 }
740
741 .wpsubs-customer__sub {
742 font-size: 12px;
743 color: var(--wpsubs-text-muted);
744 line-height: 1.3;
745 white-space: nowrap;
746 overflow: hidden;
747 text-overflow: ellipsis;
748 display: block;
749 }
750
751 .wpsubs-avatar {
752 width: 36px;
753 height: 36px;
754 border-radius: 50%;
755 display: flex;
756 align-items: center;
757 justify-content: center;
758 font-size: 11px;
759 font-weight: 700;
760 flex-shrink: 0;
761 text-transform: uppercase;
762 letter-spacing: 0.03em;
763 user-select: none;
764 background: var(--wpsubs-surface-muted);
765 color: var(--wpsubs-text-muted);
766 }
767
768 .wpsubs-avatar[data-color="0"] {
769 background: #dbeafe;
770 color: #1d4ed8;
771 }
772 .wpsubs-avatar[data-color="1"] {
773 background: #d1fae5;
774 color: #065f46;
775 }
776 .wpsubs-avatar[data-color="2"] {
777 background: #fce7f3;
778 color: #9d174d;
779 }
780 .wpsubs-avatar[data-color="3"] {
781 background: #e0e7ff;
782 color: #4338ca;
783 }
784 .wpsubs-avatar[data-color="4"] {
785 background: #fef3c7;
786 color: #92400e;
787 }
788 .wpsubs-avatar[data-color="5"] {
789 background: #fee2e2;
790 color: #991b1b;
791 }
792 .wpsubs-avatar[data-color="6"] {
793 background: #f3e8ff;
794 color: #6b21a8;
795 }
796 .wpsubs-avatar[data-color="7"] {
797 background: #ccfbf1;
798 color: #134e4a;
799 }
800
801 /* --------------------------------------------------------------------------
802 Cell: product title + id below
803 -------------------------------------------------------------------------- */
804 .wpsubs-cell-title {
805 font-weight: 400;
806 color: var(--wpsubs-text);
807 font-size: 13.5px;
808 line-height: 1.3;
809 white-space: nowrap;
810 overflow: hidden;
811 text-overflow: ellipsis;
812 text-decoration: none;
813 display: block;
814 }
815
816 a.wpsubs-cell-title:hover {
817 color: var(--wpsubs-brand);
818 text-decoration: none;
819 }
820
821 .wpsubs-cell-id {
822 font-size: 12px;
823 color: var(--wpsubs-text-muted);
824 line-height: 1.3;
825 display: block;
826 }
827
828 /* --------------------------------------------------------------------------
829 Status badge with dot
830 -------------------------------------------------------------------------- */
831 .wpsubs-badge {
832 display: inline-flex;
833 align-items: center;
834 gap: 5px;
835 padding: 2px 10px;
836 border-radius: 9999px;
837 font-size: 12px;
838 font-weight: 500;
839 white-space: nowrap;
840 line-height: 1.6;
841 border: 1px solid transparent;
842 }
843
844 .wpsubs-badge__dot {
845 width: 6px;
846 height: 6px;
847 border-radius: 50%;
848 flex-shrink: 0;
849 }
850
851 .wpsubs-badge--active {
852 background: #dcfce7;
853 color: #15803d;
854 border-color: #bbf7d0;
855 }
856 .wpsubs-badge--active .wpsubs-badge__dot {
857 background: #16a34a;
858 }
859
860 .wpsubs-badge--pending {
861 background: #eff6ff;
862 color: #1d4ed8;
863 border-color: #bfdbfe;
864 }
865 .wpsubs-badge--pending .wpsubs-badge__dot {
866 background: #3b82f6;
867 }
868
869 .wpsubs-badge--pending-cancel {
870 background: #fefce8;
871 color: #854d0e;
872 border-color: #fde68a;
873 }
874 .wpsubs-badge--pending-cancel .wpsubs-badge__dot {
875 background: #ca8a04;
876 }
877
878 .wpsubs-badge--cancelled {
879 background: #f3f4f6;
880 color: #4b5563;
881 border-color: #e5e7eb;
882 }
883 .wpsubs-badge--cancelled .wpsubs-badge__dot {
884 background: #9ca3af;
885 }
886
887 .wpsubs-badge--expired {
888 background: #fee2e2;
889 color: #991b1b;
890 border-color: #fca5a5;
891 }
892 .wpsubs-badge--expired .wpsubs-badge__dot {
893 background: #dc2626;
894 }
895
896 .wpsubs-badge--completed {
897 background: #eff6ff;
898 color: #1e40af;
899 border-color: #bfdbfe;
900 }
901 .wpsubs-badge--completed .wpsubs-badge__dot {
902 background: #2563eb;
903 }
904
905 .wpsubs-badge--draft {
906 background: #f1f5f9;
907 color: #475569;
908 border-color: #cbd5e1;
909 }
910 .wpsubs-badge--draft .wpsubs-badge__dot {
911 background: #94a3b8;
912 }
913
914 .wpsubs-badge--trash {
915 background: #fee2e2;
916 color: #991b1b;
917 border-color: #fca5a5;
918 }
919 .wpsubs-badge--trash .wpsubs-badge__dot {
920 background: #ef4444;
921 }
922
923 /* --------------------------------------------------------------------------
924 Row actions (three-dot dropdown)
925 -------------------------------------------------------------------------- */
926 .wpsubs-row-actions {
927 position: relative;
928 display: flex;
929 justify-content: flex-end;
930 }
931
932 .wpsubs-row-actions__trigger {
933 display: flex;
934 align-items: center;
935 justify-content: center;
936 width: 30px;
937 height: 30px;
938 border-radius: var(--wpsubs-radius-sm);
939 border: none;
940 background: transparent;
941 cursor: pointer;
942 color: var(--wpsubs-text-subtle);
943 transition:
944 background 0.12s,
945 color 0.12s;
946 padding: 0;
947 font-size: 18px;
948 letter-spacing: 1px;
949 line-height: 1;
950 }
951
952 .wpsubs-row-actions__trigger:hover,
953 .wpsubs-row-actions--open .wpsubs-row-actions__trigger {
954 background: var(--wpsubs-surface-muted);
955 color: var(--wpsubs-text);
956 outline: none;
957 }
958
959 @keyframes wpsubs-dropdown-in {
960 from {
961 opacity: 0;
962 transform: translateY(-4px);
963 }
964 to {
965 opacity: 1;
966 transform: translateY(0);
967 }
968 }
969
970 .wpsubs-dropdown {
971 display: none;
972 position: absolute;
973 right: 0;
974 top: calc(100% + 4px);
975 width: max-content;
976 box-sizing: border-box;
977 background: var(--wpsubs-surface);
978 border: 1px solid var(--wpsubs-border);
979 border-radius: var(--wpsubs-radius);
980 box-shadow: var(--wpsubs-shadow-md);
981 z-index: 9999;
982 padding: 4px;
983 }
984
985 .wpsubs-dropdown--open {
986 display: block;
987 animation: wpsubs-dropdown-in 0.1s ease;
988 }
989
990 .wpsubs-dropdown__item {
991 display: flex;
992 align-items: center;
993 gap: 8px;
994 width: 100%;
995 padding: 7px 10px;
996 border-radius: var(--wpsubs-radius-sm);
997 border: none;
998 background: transparent;
999 font-size: 13px;
1000 font-family: inherit;
1001 color: var(--wpsubs-text);
1002 cursor: pointer;
1003 text-align: left;
1004 text-decoration: none;
1005 white-space: nowrap;
1006 transition: background 0.1s;
1007 box-sizing: border-box;
1008 line-height: 1.4;
1009 }
1010
1011 .wpsubs-dropdown__item:hover {
1012 background: var(--wpsubs-surface-muted);
1013 color: var(--wpsubs-text);
1014 text-decoration: none;
1015 }
1016
1017 .wpsubs-dropdown__item:disabled {
1018 color: var(--wpsubs-text-subtle);
1019 cursor: not-allowed;
1020 }
1021
1022 .wpsubs-dropdown__item--danger {
1023 color: #dc2626;
1024 }
1025 .wpsubs-dropdown__item--danger:hover {
1026 background: #fee2e2;
1027 color: #b91c1c;
1028 }
1029
1030 .wpsubs-dropdown__divider {
1031 height: 1px;
1032 background: var(--wpsubs-border);
1033 margin: 4px 0;
1034 }
1035
1036 /* --------------------------------------------------------------------------
1037 Pagination footer (inside table card)
1038 -------------------------------------------------------------------------- */
1039 .wpsubs-pagination {
1040 display: flex;
1041 align-items: center;
1042 justify-content: space-between;
1043 padding: 12px 16px;
1044 border-top: 1px solid var(--wpsubs-border);
1045 flex-wrap: wrap;
1046 gap: 8px;
1047 }
1048
1049 .wpsubs-pagination__info {
1050 font-size: 12.5px;
1051 color: var(--wpsubs-text-muted);
1052 }
1053
1054 .wpsubs-pagination__nav {
1055 display: flex;
1056 align-items: center;
1057 gap: 4px;
1058 }
1059
1060 .wpsubs-pagination__btn {
1061 display: inline-flex;
1062 align-items: center;
1063 justify-content: center;
1064 width: 26px;
1065 height: 26px;
1066 padding: 0;
1067 border: 1px solid var(--wpsubs-border);
1068 border-radius: var(--wpsubs-radius-sm);
1069 background: var(--wpsubs-surface);
1070 cursor: pointer;
1071 font-size: 12px;
1072 font-weight: 500;
1073 color: var(--wpsubs-text-muted);
1074 transition:
1075 border-color 0.12s,
1076 color 0.12s,
1077 background 0.12s;
1078 text-decoration: none;
1079 line-height: 1;
1080 flex-shrink: 0;
1081 }
1082
1083 .wpsubs-pagination__btn:hover {
1084 border-color: var(--wpsubs-brand);
1085 color: var(--wpsubs-brand);
1086 text-decoration: none;
1087 }
1088
1089 .wpsubs-pagination__btn--disabled {
1090 opacity: 0.35;
1091 cursor: not-allowed;
1092 pointer-events: none;
1093 }
1094
1095 .wpsubs-pagination__btn--active {
1096 background: var(--wpsubs-brand);
1097 border-color: var(--wpsubs-brand);
1098 color: #fff;
1099 font-weight: 600;
1100 cursor: default;
1101 pointer-events: none;
1102 }
1103
1104 .wpsubs-pagination__ellipsis {
1105 display: inline-flex;
1106 align-items: center;
1107 justify-content: center;
1108 width: 26px;
1109 height: 26px;
1110 font-size: 12px;
1111 color: var(--wpsubs-text-subtle);
1112 user-select: none;
1113 }
1114
1115 /* --------------------------------------------------------------------------
1116 Empty state
1117 -------------------------------------------------------------------------- */
1118 .wpsubs-empty {
1119 display: flex;
1120 flex-direction: column;
1121 align-items: center;
1122 justify-content: center;
1123 padding: 64px 24px;
1124 text-align: center;
1125 }
1126
1127 .wpsubs-empty__icon {
1128 font-size: 2.5rem;
1129 margin-bottom: 14px;
1130 opacity: 0.45;
1131 line-height: 1;
1132 }
1133
1134 .wpsubs-empty__title {
1135 font-size: 15px;
1136 font-weight: 600;
1137 color: var(--wpsubs-text);
1138 margin: 0 0 6px;
1139 }
1140
1141 .wpsubs-empty__desc {
1142 font-size: 13px;
1143 color: var(--wpsubs-text-muted);
1144 margin: 0;
1145 line-height: 1.6;
1146 }
1147
1148 /* --------------------------------------------------------------------------
1149 Toggle switch (wpsubs-toggle + wpsubs-toggle-ui)
1150
1151 Usage:
1152 <input type="checkbox" class="wpsubs-toggle" id="my-toggle">
1153 <span class="wpsubs-toggle-ui" aria-hidden="true"></span>
1154 -------------------------------------------------------------------------- */
1155 .wpsubs-toggle {
1156 position: absolute !important;
1157 opacity: 0 !important;
1158 width: 0 !important;
1159 height: 0 !important;
1160 margin: 0 !important;
1161 padding: 0 !important;
1162 border: 0 !important;
1163 overflow: hidden;
1164 clip: rect(0 0 0 0);
1165 pointer-events: none;
1166 }
1167
1168 .wpsubs-toggle + .wpsubs-toggle-ui {
1169 position: relative;
1170 display: inline-block;
1171 width: 40px;
1172 height: 20px;
1173 border-radius: 999px;
1174 background: #cbd5e1;
1175 transition: all 0.2s cubic-bezier(0.27, 0.2, 0.25, 1.51);
1176 vertical-align: middle;
1177 cursor: pointer;
1178 }
1179
1180 .wpsubs-toggle + .wpsubs-toggle-ui::after {
1181 content: "";
1182 position: absolute;
1183 top: 2px;
1184 left: 2px;
1185 width: 16px;
1186 height: 16px;
1187 border-radius: 50%;
1188 background: #fff;
1189 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
1190 transition: all 0.2s cubic-bezier(0.27, 0.2, 0.25, 1.51);
1191 }
1192
1193 .wpsubs-toggle:checked + .wpsubs-toggle-ui {
1194 background: var(--wpsubs-brand);
1195 }
1196
1197 .wpsubs-toggle:checked + .wpsubs-toggle-ui::after {
1198 transform: translateX(20px);
1199 }
1200
1201 .wpsubs-toggle:focus + .wpsubs-toggle-ui {
1202 outline: none;
1203 }
1204
1205 .wpsubs-toggle:disabled + .wpsubs-toggle-ui {
1206 background: #e5e7eb;
1207 cursor: not-allowed;
1208 }
1209
1210 /* --------------------------------------------------------------------------
1211 Settings layout (wpsubs-settings-*)
1212
1213 Heading — full-width section label at the top of a card group.
1214 Field — two-column row: fixed-width label on left, control on right.
1215 -------------------------------------------------------------------------- */
1216
1217 /* Heading: spans full width of the card by pulling out of card padding (20px 24px) */
1218 .wpsubs-settings-heading {
1219 background: var(--wpsubs-surface-muted);
1220 border-bottom: 1px solid var(--wpsubs-border);
1221 border-radius: calc(var(--wpsubs-radius) - 1px) calc(var(--wpsubs-radius) - 1px) 0 0;
1222 margin: -20px -24px 20px;
1223 padding: 13px 24px;
1224 }
1225
1226 .wpsubs-settings-heading__title {
1227 font-size: 12px !important;
1228 font-weight: 600 !important;
1229 color: var(--wpsubs-text-muted) !important;
1230 text-transform: uppercase;
1231 letter-spacing: 0.06em;
1232 margin: 0;
1233 line-height: 1.4;
1234 }
1235
1236 .wpsubs-settings-heading__desc {
1237 font-size: 12px !important;
1238 color: var(--wpsubs-text-muted);
1239 margin: 3px 0 0;
1240 line-height: 1.5;
1241 }
1242
1243 /* Field row */
1244 .wpsubs-settings-field {
1245 display: flex;
1246 align-items: flex-start;
1247 gap: 24px;
1248 }
1249
1250 .wpsubs-settings-field__label {
1251 flex: 0 0 220px;
1252 font-size: 13px !important;
1253 font-weight: 500;
1254 color: var(--wpsubs-text);
1255 line-height: 1.4;
1256 padding-top: 8px; /* visually align with single-line input height */
1257 }
1258
1259 .wpsubs-settings-field__control {
1260 flex: 1;
1261 min-width: 0;
1262 }
1263
1264 /* Pro-locked fields: shown in the free plugin as a non-interactive preview. */
1265 .wpsubs-settings-field--locked .wpsubs-settings-field__control {
1266 opacity: 0.55;
1267 pointer-events: none;
1268 user-select: none;
1269 }
1270
1271 .subscrpt-pro-badge {
1272 display: inline-flex;
1273 align-items: center;
1274 vertical-align: middle;
1275 margin-right: 6px;
1276 padding: 2px 6px;
1277 border-radius: 3px;
1278 background: var(--wpsubs-brand);
1279 color: var(--wpsubs-surface);
1280 font-size: 10px;
1281 font-weight: 700;
1282 line-height: 1.4;
1283 letter-spacing: 0.04em;
1284 text-transform: uppercase;
1285 }
1286
1287 /* Constrain and normalise control widths */
1288 .wpsubs-settings-field__control .wpsubs-input,
1289 .wpsubs-settings-field__control .wpsubs-select {
1290 min-width: 260px;
1291 max-width: 400px;
1292 }
1293
1294 .wpsubs-settings-field__control .wpsubs-adv-select__trigger {
1295 min-width: 260px;
1296 }
1297
1298 .wpsubs-settings-field__control .wpsubs-tag-select {
1299 min-width: 260px;
1300 max-width: 400px;
1301 }
1302
1303 /* Input group (joined fields) — constrain width as a whole */
1304 .wpsubs-settings-field__control .wpsubs-input-group {
1305 max-width: 420px;
1306 }
1307
1308 /* Hint / description below the control */
1309 .wpsubs-settings-field__hint {
1310 font-size: 12px !important;
1311 color: var(--wpsubs-text-muted);
1312 margin: 6px 0 0;
1313 line-height: 1.5;
1314 }
1315
1316 /* Toggle label — wraps the switch + inline label text */
1317 .wpsubs-settings-toggle-label {
1318 display: inline-flex;
1319 align-items: center;
1320 gap: 10px;
1321 cursor: pointer;
1322 line-height: 1;
1323 padding-top: 0;
1324 position: relative;
1325 }
1326
1327 .wpsubs-settings-toggle-label__text {
1328 font-size: 13px !important;
1329 color: var(--wpsubs-text);
1330 }
1331
1332 /* --------------------------------------------------------------------------
1333 Tag Select (wpsubs-tag-select)
1334 Pill/tag input with an inline filter and a filterable dropdown.
1335 Supports single and multi-select. Use wpsubs_render_tag_select() PHP helper.
1336 -------------------------------------------------------------------------- */
1337 .wpsubs-tag-select {
1338 position: relative;
1339 display: block;
1340 }
1341
1342 /* The visible "input" area: pills + text input + chevron */
1343 .wpsubs-tag-select__field {
1344 display: flex;
1345 flex-wrap: wrap;
1346 align-items: center;
1347 gap: 4px;
1348 padding: 4px 36px 4px 6px;
1349 min-height: 36px;
1350 border: 1px solid var(--wpsubs-border);
1351 border-radius: var(--wpsubs-radius-sm);
1352 background: var(--wpsubs-surface);
1353 cursor: text;
1354 position: relative;
1355 box-sizing: border-box;
1356 transition:
1357 border-color 0.12s,
1358 box-shadow 0.12s;
1359 }
1360
1361 .wpsubs-tag-select--open .wpsubs-tag-select__field,
1362 .wpsubs-tag-select__field:focus-within {
1363 border-color: var(--wpsubs-brand);
1364 box-shadow: 0 0 0 3px var(--wpsubs-brand-ring);
1365 outline: none;
1366 }
1367
1368 /* Pill (selected item badge) */
1369 .wpsubs-tag-select__pill {
1370 display: inline-flex;
1371 align-items: center;
1372 gap: 3px;
1373 padding: 2px 3px 2px 8px;
1374 background: var(--wpsubs-brand-light);
1375 border: 1px solid var(--wpsubs-brand-ring);
1376 border-radius: 4px;
1377 font-size: 12px;
1378 font-family: inherit;
1379 color: var(--wpsubs-text);
1380 max-width: 200px;
1381 flex-shrink: 0;
1382 }
1383
1384 .wpsubs-tag-select__pill-label {
1385 overflow: hidden;
1386 text-overflow: ellipsis;
1387 white-space: nowrap;
1388 line-height: 1.4;
1389 }
1390
1391 .wpsubs-tag-select__pill-remove {
1392 display: inline-flex;
1393 align-items: center;
1394 justify-content: center;
1395 width: 18px;
1396 height: 18px;
1397 border: none;
1398 background: none;
1399 padding: 0;
1400 cursor: pointer;
1401 color: var(--wpsubs-text-muted);
1402 border-radius: 3px;
1403 font-size: 15px;
1404 line-height: 1;
1405 flex-shrink: 0;
1406 transition:
1407 background 0.1s,
1408 color 0.1s;
1409 }
1410
1411 .wpsubs-tag-select__pill-remove:hover {
1412 background: rgba(34, 113, 177, 0.15);
1413 color: var(--wpsubs-brand-dark);
1414 }
1415
1416 /* Inline filter input */
1417 .wpsubs-tag-select__input {
1418 flex: 1;
1419 min-width: 80px;
1420 height: 28px !important;
1421 min-height: 28px !important;
1422 border: none !important;
1423 outline: none !important;
1424 background: transparent !important;
1425 font-size: 13px !important;
1426 font-family: inherit !important;
1427 color: var(--wpsubs-text) !important;
1428 padding: 0 2px !important;
1429 box-shadow: none !important;
1430 border-radius: 0 !important;
1431 margin: 0 !important;
1432 }
1433
1434 .wpsubs-tag-select__input::placeholder {
1435 color: var(--wpsubs-text-subtle);
1436 }
1437
1438 /* Chevron icon — absolutely positioned on the right */
1439 .wpsubs-tag-select__chevron {
1440 position: absolute;
1441 right: 10px;
1442 top: 50%;
1443 transform: translateY(-50%);
1444 pointer-events: none;
1445 opacity: 0.5;
1446 display: flex;
1447 align-items: center;
1448 transition: opacity 0.12s;
1449 }
1450
1451 .wpsubs-tag-select--open .wpsubs-tag-select__chevron {
1452 opacity: 0.8;
1453 }
1454
1455 .wpsubs-tag-select--open .wpsubs-tag-select__chevron svg {
1456 transform: rotate(180deg);
1457 }
1458
1459 /* Dropdown panel */
1460 .wpsubs-tag-select__dropdown {
1461 display: none;
1462 position: absolute;
1463 top: calc(100% + 4px);
1464 left: 0;
1465 width: 100%;
1466 box-sizing: border-box;
1467 background: var(--wpsubs-surface);
1468 border: 1px solid var(--wpsubs-border);
1469 border-radius: var(--wpsubs-radius);
1470 box-shadow: var(--wpsubs-shadow-md);
1471 z-index: 9999;
1472 animation: wpsubs-dropdown-in 0.1s ease;
1473 }
1474
1475 .wpsubs-tag-select--open .wpsubs-tag-select__dropdown {
1476 display: block;
1477 }
1478
1479 .wpsubs-tag-select__list {
1480 max-height: 220px;
1481 overflow-y: auto;
1482 padding: 4px;
1483 }
1484
1485 .wpsubs-tag-select__item {
1486 display: block;
1487 width: 100%;
1488 padding: 7px 10px;
1489 border-radius: var(--wpsubs-radius-sm);
1490 border: none;
1491 background: transparent;
1492 font-size: 13px;
1493 font-family: inherit;
1494 color: var(--wpsubs-text);
1495 cursor: pointer;
1496 text-align: left;
1497 white-space: nowrap;
1498 overflow: hidden;
1499 text-overflow: ellipsis;
1500 transition: background 0.1s;
1501 box-sizing: border-box;
1502 line-height: 1.4;
1503 }
1504
1505 .wpsubs-tag-select__item:hover {
1506 background: var(--wpsubs-surface-muted);
1507 color: var(--wpsubs-text);
1508 text-decoration: none;
1509 }
1510
1511 .wpsubs-tag-select__item[data-disabled] {
1512 opacity: 0.45;
1513 cursor: not-allowed;
1514 }
1515
1516 .wpsubs-tag-select__empty {
1517 display: none;
1518 padding: 10px 14px;
1519 font-size: 12.5px;
1520 color: var(--wpsubs-text-muted);
1521 text-align: center;
1522 }
1523
1524 /* Settings context */
1525 .wpsubs-settings-field__control .wpsubs-tag-select {
1526 max-width: 400px;
1527 }
1528
1529 /* --------------------------------------------------------------------------
1530 Modal (wpsubs-modal)
1531 Centered dialog over a dimmed backdrop. Toggle visibility with the [hidden]
1532 attribute (or remove it to show). Behaviour (open/close) is wired per page.
1533 -------------------------------------------------------------------------- */
1534 .wpsubs-modal {
1535 position: fixed;
1536 inset: 0;
1537 z-index: 100000;
1538 display: flex;
1539 align-items: center;
1540 justify-content: center;
1541 }
1542
1543 .wpsubs-modal[hidden] {
1544 display: none;
1545 }
1546
1547 .wpsubs-modal__backdrop {
1548 position: absolute;
1549 inset: 0;
1550 background: rgba(17, 24, 39, 0.5);
1551 }
1552
1553 .wpsubs-modal__dialog {
1554 position: relative;
1555 display: flex;
1556 flex-direction: column;
1557 width: min(640px, calc(100vw - 40px));
1558 max-height: calc(100vh - 80px);
1559 background: var(--wpsubs-surface);
1560 border-radius: var(--wpsubs-radius);
1561 box-shadow: var(--wpsubs-shadow-md);
1562 }
1563
1564 .wpsubs-modal__head {
1565 display: flex;
1566 align-items: center;
1567 justify-content: space-between;
1568 gap: 12px;
1569 padding: 14px 18px;
1570 border-bottom: 1px solid var(--wpsubs-border);
1571 }
1572
1573 .wpsubs-modal__title {
1574 font-size: 14px;
1575 font-weight: 600;
1576 color: var(--wpsubs-text);
1577 }
1578
1579 .wpsubs-modal__close {
1580 background: none;
1581 border: none;
1582 padding: 0;
1583 font-size: 22px;
1584 line-height: 1;
1585 cursor: pointer;
1586 color: var(--wpsubs-text-muted);
1587 transition: color 0.12s;
1588 }
1589
1590 .wpsubs-modal__close:hover {
1591 color: var(--wpsubs-text);
1592 }
1593
1594 .wpsubs-modal__body {
1595 padding: 18px;
1596 overflow-y: auto;
1597 }
1598
1599 .wpsubs-modal__footer {
1600 display: flex;
1601 align-items: center;
1602 justify-content: flex-end;
1603 gap: 8px;
1604 padding: 14px 18px;
1605 border-top: 1px solid var(--wpsubs-border);
1606 }
1607