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

1,845 lines 43.1 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 12px;
1047 min-width: 0;
1048 }
1049
1050 .wpsubs-pagination > .wpsubs-pagination__info {
1051 min-width: 0;
1052 flex-shrink: 1;
1053 }
1054
1055 .wpsubs-pagination__info {
1056 font-size: 12.5px;
1057 color: var(--wpsubs-text-muted);
1058 }
1059
1060 .wpsubs-pagination__nav {
1061 display: flex;
1062 align-items: center;
1063 flex-wrap: wrap;
1064 justify-content: flex-end;
1065 gap: 4px;
1066 min-width: 0;
1067 }
1068
1069 .wpsubs-pagination__btn {
1070 display: inline-flex;
1071 align-items: center;
1072 justify-content: center;
1073 width: 26px;
1074 height: 26px;
1075 padding: 0;
1076 border: 1px solid var(--wpsubs-border);
1077 border-radius: var(--wpsubs-radius-sm);
1078 background: var(--wpsubs-surface);
1079 cursor: pointer;
1080 font-size: 12px;
1081 font-weight: 500;
1082 color: var(--wpsubs-text-muted);
1083 transition:
1084 border-color 0.12s,
1085 color 0.12s,
1086 background 0.12s;
1087 text-decoration: none;
1088 line-height: 1;
1089 flex-shrink: 0;
1090 }
1091
1092 /* Strip the WordPress admin / browser default focus ring. WP admin's
1093 `forms.css` applies a coloured border + box-shadow on :focus to every
1094 button-class element; on these small chips it looks like a heavy
1095 double-border. Keep a subtle :focus-visible ring for keyboard users. */
1096 .wpsubs-pagination__btn:focus,
1097 .wpsubs-pagination__btn:focus-visible {
1098 outline: none;
1099 box-shadow: none;
1100 border-color: var(--wpsubs-border);
1101 color: var(--wpsubs-text-muted);
1102 background: var(--wpsubs-surface);
1103 }
1104 .wpsubs-pagination__btn:focus-visible {
1105 box-shadow: 0 0 0 2px var(--wpsubs-brand-ring);
1106 border-color: var(--wpsubs-brand);
1107 color: var(--wpsubs-brand);
1108 }
1109
1110 .wpsubs-pagination__btn:hover {
1111 border-color: var(--wpsubs-brand);
1112 color: var(--wpsubs-brand);
1113 text-decoration: none;
1114 }
1115
1116 .wpsubs-pagination__btn--disabled {
1117 opacity: 0.35;
1118 cursor: not-allowed;
1119 pointer-events: none;
1120 }
1121
1122 .wpsubs-pagination__btn--active {
1123 background: var(--wpsubs-brand);
1124 border-color: var(--wpsubs-brand);
1125 color: #fff;
1126 font-weight: 600;
1127 cursor: default;
1128 pointer-events: none;
1129 }
1130
1131 /* Ellipsis is a non-interactive chip with the same shell as a page button.
1132 Reuses the base `.wpsubs-pagination__btn` for size/border/background/radius
1133 and only overrides cursor + hover (so it can't be mistaken for clickable). */
1134 .wpsubs-pagination__btn--ellipsis {
1135 font-weight: 600;
1136 letter-spacing: 0.5px;
1137 color: var(--wpsubs-text-subtle);
1138 cursor: default;
1139 pointer-events: none;
1140 user-select: none;
1141 }
1142 .wpsubs-pagination__btn--ellipsis:hover {
1143 border-color: var(--wpsubs-border);
1144 color: var(--wpsubs-text-subtle);
1145 }
1146
1147 /* Back-compat alias — kept so existing markup / extensions using the
1148 standalone class still render identically. */
1149 .wpsubs-pagination__ellipsis {
1150 display: inline-flex;
1151 align-items: center;
1152 justify-content: center;
1153 width: 26px;
1154 height: 26px;
1155 border: 1px solid var(--wpsubs-border);
1156 border-radius: var(--wpsubs-radius-sm);
1157 background: var(--wpsubs-surface);
1158 cursor: default;
1159 user-select: none;
1160 flex-shrink: 0;
1161 }
1162
1163 /* --------------------------------------------------------------------------
1164 Empty state
1165 -------------------------------------------------------------------------- */
1166 .wpsubs-empty {
1167 display: flex;
1168 flex-direction: column;
1169 align-items: center;
1170 justify-content: center;
1171 padding: 64px 24px;
1172 text-align: center;
1173 }
1174
1175 .wpsubs-empty__icon {
1176 font-size: 2.5rem;
1177 margin-bottom: 14px;
1178 opacity: 0.45;
1179 line-height: 1;
1180 }
1181
1182 .wpsubs-empty__title {
1183 font-size: 15px;
1184 font-weight: 600;
1185 color: var(--wpsubs-text);
1186 margin: 0 0 6px;
1187 }
1188
1189 .wpsubs-empty__desc {
1190 font-size: 13px;
1191 color: var(--wpsubs-text-muted);
1192 margin: 0;
1193 line-height: 1.6;
1194 }
1195
1196 /* --------------------------------------------------------------------------
1197 Toggle switch (wpsubs-toggle + wpsubs-toggle-ui)
1198
1199 Usage:
1200 <input type="checkbox" class="wpsubs-toggle" id="my-toggle">
1201 <span class="wpsubs-toggle-ui" aria-hidden="true"></span>
1202 -------------------------------------------------------------------------- */
1203 .wpsubs-toggle {
1204 position: absolute !important;
1205 opacity: 0 !important;
1206 width: 0 !important;
1207 height: 0 !important;
1208 margin: 0 !important;
1209 padding: 0 !important;
1210 border: 0 !important;
1211 overflow: hidden;
1212 clip: rect(0 0 0 0);
1213 pointer-events: none;
1214 }
1215
1216 .wpsubs-toggle + .wpsubs-toggle-ui {
1217 position: relative;
1218 display: inline-block;
1219 width: 40px;
1220 height: 20px;
1221 border-radius: 999px;
1222 background: #cbd5e1;
1223 transition: all 0.2s cubic-bezier(0.27, 0.2, 0.25, 1.51);
1224 vertical-align: middle;
1225 cursor: pointer;
1226 }
1227
1228 .wpsubs-toggle + .wpsubs-toggle-ui::after {
1229 content: "";
1230 position: absolute;
1231 top: 2px;
1232 left: 2px;
1233 width: 16px;
1234 height: 16px;
1235 border-radius: 50%;
1236 background: #fff;
1237 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
1238 transition: all 0.2s cubic-bezier(0.27, 0.2, 0.25, 1.51);
1239 }
1240
1241 .wpsubs-toggle:checked + .wpsubs-toggle-ui {
1242 background: var(--wpsubs-brand);
1243 }
1244
1245 .wpsubs-toggle:checked + .wpsubs-toggle-ui::after {
1246 transform: translateX(20px);
1247 }
1248
1249 .wpsubs-toggle:focus + .wpsubs-toggle-ui {
1250 outline: none;
1251 }
1252
1253 .wpsubs-toggle:disabled + .wpsubs-toggle-ui {
1254 background: #e5e7eb;
1255 cursor: not-allowed;
1256 }
1257
1258 /* --------------------------------------------------------------------------
1259 Settings layout (wpsubs-settings-*)
1260
1261 Heading — full-width section label at the top of a card group.
1262 Field — two-column row: fixed-width label on left, control on right.
1263 -------------------------------------------------------------------------- */
1264
1265 /* Heading: spans full width of the card by pulling out of card padding (20px 24px) */
1266 .wpsubs-settings-heading {
1267 background: var(--wpsubs-surface-muted);
1268 border-bottom: 1px solid var(--wpsubs-border);
1269 border-radius: calc(var(--wpsubs-radius) - 1px) calc(var(--wpsubs-radius) - 1px) 0 0;
1270 margin: -20px -24px 20px;
1271 padding: 13px 24px;
1272 }
1273
1274 .wpsubs-settings-heading__title {
1275 font-size: 12px !important;
1276 font-weight: 600 !important;
1277 color: var(--wpsubs-text-muted) !important;
1278 text-transform: uppercase;
1279 letter-spacing: 0.06em;
1280 margin: 0;
1281 line-height: 1.4;
1282 }
1283
1284 .wpsubs-settings-heading__desc {
1285 font-size: 12px !important;
1286 color: var(--wpsubs-text-muted);
1287 margin: 3px 0 0;
1288 line-height: 1.5;
1289 }
1290
1291 /* Field row */
1292 .wpsubs-settings-field {
1293 display: flex;
1294 align-items: flex-start;
1295 gap: 24px;
1296 }
1297
1298 .wpsubs-settings-field__label {
1299 flex: 0 0 220px;
1300 font-size: 13px !important;
1301 font-weight: 500;
1302 color: var(--wpsubs-text);
1303 line-height: 1.4;
1304 padding-top: 2px; /* visually align with single-line input height */
1305 }
1306
1307 .wpsubs-settings-field__control {
1308 flex: 1;
1309 min-width: 0;
1310 }
1311
1312 /* Pro-locked fields: shown in the free plugin as a non-interactive preview. */
1313 .wpsubs-settings-field--locked .wpsubs-settings-field__control {
1314 opacity: 0.55;
1315 pointer-events: none;
1316 user-select: none;
1317 }
1318
1319 .subscrpt-pro-badge {
1320 display: inline-flex;
1321 align-items: center;
1322 vertical-align: middle;
1323 margin-right: 6px;
1324 padding: 2px 6px;
1325 border-radius: 3px;
1326 background: var(--wpsubs-brand);
1327 color: var(--wpsubs-surface);
1328 font-size: 10px;
1329 font-weight: 700;
1330 line-height: 1.4;
1331 letter-spacing: 0.04em;
1332 text-transform: uppercase;
1333 }
1334
1335 /* Constrain and normalise control widths */
1336 .wpsubs-settings-field__control .wpsubs-input,
1337 .wpsubs-settings-field__control .wpsubs-select {
1338 min-width: 260px;
1339 max-width: 400px;
1340 }
1341
1342 .wpsubs-settings-field__control .wpsubs-adv-select__trigger {
1343 min-width: 260px;
1344 }
1345
1346 .wpsubs-settings-field__control .wpsubs-tag-select {
1347 min-width: 260px;
1348 max-width: 400px;
1349 }
1350
1351 /* Input group (joined fields) — constrain width as a whole */
1352 .wpsubs-settings-field__control .wpsubs-input-group {
1353 max-width: 420px;
1354 }
1355
1356 /* Hint / description below the control */
1357 .wpsubs-settings-field__hint {
1358 font-size: 12px !important;
1359 color: var(--wpsubs-text-muted);
1360 margin: 6px 0 0;
1361 line-height: 1.5;
1362 }
1363
1364 /* Toggle label — wraps the switch + inline label text */
1365 .wpsubs-settings-toggle-label {
1366 display: inline-flex;
1367 align-items: center;
1368 gap: 10px;
1369 cursor: pointer;
1370 line-height: 1;
1371 padding-top: 0;
1372 position: relative;
1373 }
1374
1375 .wpsubs-settings-toggle-label__text {
1376 font-size: 13px !important;
1377 color: var(--wpsubs-text);
1378 }
1379
1380 /* --------------------------------------------------------------------------
1381 Tag Select (wpsubs-tag-select)
1382 Pill/tag input with an inline filter and a filterable dropdown.
1383 Supports single and multi-select. Use wpsubs_render_tag_select() PHP helper.
1384 -------------------------------------------------------------------------- */
1385 .wpsubs-tag-select {
1386 position: relative;
1387 display: block;
1388 }
1389
1390 /* The visible "input" area: pills + text input + chevron */
1391 .wpsubs-tag-select__field {
1392 display: flex;
1393 flex-wrap: wrap;
1394 align-items: center;
1395 gap: 4px;
1396 padding: 4px 36px 4px 6px;
1397 min-height: 36px;
1398 border: 1px solid var(--wpsubs-border);
1399 border-radius: var(--wpsubs-radius-sm);
1400 background: var(--wpsubs-surface);
1401 cursor: text;
1402 position: relative;
1403 box-sizing: border-box;
1404 transition:
1405 border-color 0.12s,
1406 box-shadow 0.12s;
1407 }
1408
1409 .wpsubs-tag-select--open .wpsubs-tag-select__field,
1410 .wpsubs-tag-select__field:focus-within {
1411 border-color: var(--wpsubs-brand);
1412 box-shadow: 0 0 0 3px var(--wpsubs-brand-ring);
1413 outline: none;
1414 }
1415
1416 /* Pill (selected item badge) */
1417 .wpsubs-tag-select__pill {
1418 display: inline-flex;
1419 align-items: center;
1420 gap: 3px;
1421 padding: 2px 3px 2px 8px;
1422 background: var(--wpsubs-brand-light);
1423 border: 1px solid var(--wpsubs-brand-ring);
1424 border-radius: 4px;
1425 font-size: 12px;
1426 font-family: inherit;
1427 color: var(--wpsubs-text);
1428 max-width: 200px;
1429 flex-shrink: 0;
1430 }
1431
1432 .wpsubs-tag-select__pill-label {
1433 overflow: hidden;
1434 text-overflow: ellipsis;
1435 white-space: nowrap;
1436 line-height: 1.4;
1437 }
1438
1439 .wpsubs-tag-select__pill-remove {
1440 display: inline-flex;
1441 align-items: center;
1442 justify-content: center;
1443 width: 18px;
1444 height: 18px;
1445 border: none;
1446 background: none;
1447 padding: 0;
1448 cursor: pointer;
1449 color: var(--wpsubs-text-muted);
1450 border-radius: 3px;
1451 font-size: 15px;
1452 line-height: 1;
1453 flex-shrink: 0;
1454 transition:
1455 background 0.1s,
1456 color 0.1s;
1457 }
1458
1459 .wpsubs-tag-select__pill-remove:hover {
1460 background: rgba(34, 113, 177, 0.15);
1461 color: var(--wpsubs-brand-dark);
1462 }
1463
1464 /* Inline filter input */
1465 .wpsubs-tag-select__input {
1466 flex: 1;
1467 min-width: 80px;
1468 height: 28px !important;
1469 min-height: 28px !important;
1470 border: none !important;
1471 outline: none !important;
1472 background: transparent !important;
1473 font-size: 13px !important;
1474 font-family: inherit !important;
1475 color: var(--wpsubs-text) !important;
1476 padding: 0 2px !important;
1477 box-shadow: none !important;
1478 border-radius: 0 !important;
1479 margin: 0 !important;
1480 }
1481
1482 .wpsubs-tag-select__input::placeholder {
1483 color: var(--wpsubs-text-subtle);
1484 }
1485
1486 /* Chevron icon — absolutely positioned on the right */
1487 .wpsubs-tag-select__chevron {
1488 position: absolute;
1489 right: 10px;
1490 top: 50%;
1491 transform: translateY(-50%);
1492 pointer-events: none;
1493 opacity: 0.5;
1494 display: flex;
1495 align-items: center;
1496 transition: opacity 0.12s;
1497 }
1498
1499 .wpsubs-tag-select--open .wpsubs-tag-select__chevron {
1500 opacity: 0.8;
1501 }
1502
1503 .wpsubs-tag-select--open .wpsubs-tag-select__chevron svg {
1504 transform: rotate(180deg);
1505 }
1506
1507 /* Dropdown panel */
1508 .wpsubs-tag-select__dropdown {
1509 display: none;
1510 position: absolute;
1511 top: calc(100% + 4px);
1512 left: 0;
1513 width: 100%;
1514 box-sizing: border-box;
1515 background: var(--wpsubs-surface);
1516 border: 1px solid var(--wpsubs-border);
1517 border-radius: var(--wpsubs-radius);
1518 box-shadow: var(--wpsubs-shadow-md);
1519 z-index: 9999;
1520 animation: wpsubs-dropdown-in 0.1s ease;
1521 }
1522
1523 .wpsubs-tag-select--open .wpsubs-tag-select__dropdown {
1524 display: block;
1525 }
1526
1527 .wpsubs-tag-select__list {
1528 max-height: 220px;
1529 overflow-y: auto;
1530 padding: 4px;
1531 }
1532
1533 .wpsubs-tag-select__item {
1534 display: block;
1535 width: 100%;
1536 padding: 7px 10px;
1537 border-radius: var(--wpsubs-radius-sm);
1538 border: none;
1539 background: transparent;
1540 font-size: 13px;
1541 font-family: inherit;
1542 color: var(--wpsubs-text);
1543 cursor: pointer;
1544 text-align: left;
1545 white-space: nowrap;
1546 overflow: hidden;
1547 text-overflow: ellipsis;
1548 transition: background 0.1s;
1549 box-sizing: border-box;
1550 line-height: 1.4;
1551 }
1552
1553 .wpsubs-tag-select__item:hover {
1554 background: var(--wpsubs-surface-muted);
1555 color: var(--wpsubs-text);
1556 text-decoration: none;
1557 }
1558
1559 .wpsubs-tag-select__item[data-disabled] {
1560 opacity: 0.45;
1561 cursor: not-allowed;
1562 }
1563
1564 .wpsubs-tag-select__empty {
1565 display: none;
1566 padding: 10px 14px;
1567 font-size: 12.5px;
1568 color: var(--wpsubs-text-muted);
1569 text-align: center;
1570 }
1571
1572 /* Settings context */
1573 .wpsubs-settings-field__control .wpsubs-tag-select {
1574 max-width: 400px;
1575 }
1576
1577 /* --------------------------------------------------------------------------
1578 Modal (wpsubs-modal)
1579 Centered dialog over a dimmed backdrop. Toggle visibility with the [hidden]
1580 attribute (or remove it to show). Behaviour (open/close) is wired per page.
1581 -------------------------------------------------------------------------- */
1582 .wpsubs-modal {
1583 position: fixed;
1584 inset: 0;
1585 z-index: 100000;
1586 display: flex;
1587 align-items: center;
1588 justify-content: center;
1589 }
1590
1591 .wpsubs-modal[hidden] {
1592 display: none;
1593 }
1594
1595 .wpsubs-modal__backdrop {
1596 position: absolute;
1597 inset: 0;
1598 background: rgba(17, 24, 39, 0.5);
1599 }
1600
1601 .wpsubs-modal__dialog {
1602 position: relative;
1603 display: flex;
1604 flex-direction: column;
1605 width: min(640px, calc(100vw - 40px));
1606 max-height: calc(100vh - 80px);
1607 background: var(--wpsubs-surface);
1608 border-radius: var(--wpsubs-radius);
1609 box-shadow: var(--wpsubs-shadow-md);
1610 }
1611
1612 .wpsubs-modal__head {
1613 display: flex;
1614 align-items: center;
1615 justify-content: space-between;
1616 gap: 12px;
1617 padding: 14px 18px;
1618 border-bottom: 1px solid var(--wpsubs-border);
1619 }
1620
1621 .wpsubs-modal__title {
1622 font-size: 14px;
1623 font-weight: 600;
1624 color: var(--wpsubs-text);
1625 }
1626
1627 .wpsubs-modal__close {
1628 background: none;
1629 border: none;
1630 padding: 0;
1631 font-size: 22px;
1632 line-height: 1;
1633 cursor: pointer;
1634 color: var(--wpsubs-text-muted);
1635 transition: color 0.12s;
1636 }
1637
1638 .wpsubs-modal__close:hover {
1639 color: var(--wpsubs-text);
1640 }
1641
1642 .wpsubs-modal__body {
1643 padding: 18px;
1644 overflow-y: auto;
1645 }
1646
1647 .wpsubs-modal__footer {
1648 display: flex;
1649 align-items: center;
1650 justify-content: flex-end;
1651 gap: 8px;
1652 padding: 14px 18px;
1653 border-top: 1px solid var(--wpsubs-border);
1654 }
1655
1656 /* --------------------------------------------------------------------------
1657 Edit list (wpsubs-editlist)
1658 Reorderable list of text items with per-row controls and an inline add
1659 input. Behaviour wired by WPSubsEditList (admin-components.js); the ordered
1660 list is serialized as JSON into a hidden input for form submission.
1661 -------------------------------------------------------------------------- */
1662 .wpsubs-editlist {
1663 max-width: 520px;
1664 }
1665
1666 .wpsubs-editlist__trigger {
1667 display: inline-flex;
1668 align-items: center;
1669 gap: 8px;
1670 }
1671
1672 .wpsubs-editlist__count {
1673 display: inline-flex;
1674 align-items: center;
1675 justify-content: center;
1676 min-width: 20px;
1677 height: 20px;
1678 padding: 0 6px;
1679 border-radius: 999px;
1680 background: var(--wpsubs-surface-muted, #f2f3f5);
1681 color: var(--wpsubs-text-muted, #6b7075);
1682 font-size: 11px;
1683 font-weight: 600;
1684 line-height: 1;
1685 }
1686
1687 .wpsubs-editlist__items {
1688 margin: 0 0 12px;
1689 padding: 0;
1690 list-style: none;
1691 display: flex;
1692 flex-direction: column;
1693 gap: 8px;
1694 }
1695
1696 .wpsubs-editlist__item {
1697 display: flex;
1698 align-items: center;
1699 gap: 10px;
1700 padding: 8px 10px 8px 8px;
1701 background: var(--wpsubs-surface, #fff);
1702 border: 1px solid var(--wpsubs-border, #e2e4e7);
1703 border-radius: var(--wpsubs-radius, 8px);
1704 transition:
1705 border-color 0.12s,
1706 box-shadow 0.12s;
1707 }
1708
1709 .wpsubs-editlist__item:hover {
1710 border-color: var(--wpsubs-border-strong, #c7cbd1);
1711 box-shadow: var(--wpsubs-shadow, 0 1px 2px rgba(0, 0, 0, 0.05));
1712 }
1713
1714 .wpsubs-editlist__handle {
1715 display: inline-flex;
1716 align-items: center;
1717 align-self: stretch;
1718 padding-inline: 6px 10px;
1719 color: var(--wpsubs-text-subtle, #a7aaaf);
1720 font-size: 12px;
1721 letter-spacing: -3px;
1722 line-height: 1;
1723 cursor: grab;
1724 user-select: none;
1725 }
1726
1727 .wpsubs-editlist__handle:active {
1728 cursor: grabbing;
1729 }
1730
1731 .wpsubs-editlist__item--dragging {
1732 opacity: 0.55;
1733 border-color: var(--wpsubs-brand, #2563eb);
1734 box-shadow: var(--wpsubs-shadow-md, 0 6px 18px rgba(0, 0, 0, 0.12));
1735 }
1736
1737 .wpsubs-editlist__label {
1738 flex: 1 1 auto;
1739 min-width: 0;
1740 font-size: 13px;
1741 color: var(--wpsubs-text, #1e1e1e);
1742 word-break: break-word;
1743 }
1744
1745 .wpsubs-editlist__actions {
1746 display: inline-flex;
1747 align-items: center;
1748 gap: 2px;
1749 flex: 0 0 auto;
1750 opacity: 0;
1751 transition: opacity 0.12s;
1752 }
1753
1754 .wpsubs-editlist__item:hover .wpsubs-editlist__actions,
1755 .wpsubs-editlist__actions:focus-within {
1756 opacity: 1;
1757 }
1758
1759 .wpsubs-editlist__btn {
1760 display: inline-flex;
1761 align-items: center;
1762 justify-content: center;
1763 width: 26px;
1764 height: 26px;
1765 padding: 0;
1766 border: none;
1767 border-radius: 6px;
1768 background: transparent;
1769 color: var(--wpsubs-text-muted, #6b7075);
1770 font-size: 15px;
1771 line-height: 1;
1772 cursor: pointer;
1773 transition:
1774 background 0.12s,
1775 color 0.12s;
1776 }
1777
1778 .wpsubs-editlist__btn svg {
1779 width: 15px;
1780 height: 15px;
1781 display: block;
1782 }
1783
1784 .wpsubs-editlist__btn:hover {
1785 background: var(--wpsubs-surface-muted, #f2f3f5);
1786 color: var(--wpsubs-text, #1e1e1e);
1787 }
1788
1789 .wpsubs-editlist__btn--danger:hover {
1790 background: #fef2f2;
1791 color: #dc2626;
1792 }
1793
1794 .wpsubs-editlist__empty {
1795 margin: 0 0 12px;
1796 color: var(--wpsubs-text-muted, #6b7075);
1797 font-size: 13px;
1798 font-style: italic;
1799 }
1800
1801 .wpsubs-editlist__add {
1802 display: flex;
1803 align-items: stretch;
1804 gap: 8px;
1805 width: 100%;
1806 }
1807
1808 .wpsubs-editlist__input {
1809 flex: 1 1 auto;
1810 max-width: unset !important;
1811 width: auto;
1812 }
1813
1814 .wpsubs-editlist__add-btn {
1815 display: inline-flex;
1816 align-items: center;
1817 justify-content: center;
1818 flex: 0 0 auto;
1819 width: 38px;
1820 border: none;
1821 border-radius: var(--wpsubs-radius, 8px);
1822 background: var(--wpsubs-brand, #2563eb);
1823 color: #fff;
1824 cursor: pointer;
1825 transition:
1826 background 0.12s,
1827 opacity 0.12s;
1828 }
1829
1830 .wpsubs-editlist__add-btn:hover {
1831 background: var(--wpsubs-brand-dark, #1d4ed8);
1832 }
1833
1834 .wpsubs-editlist__add-btn:disabled,
1835 .wpsubs-editlist--locked {
1836 opacity: 0.55;
1837 pointer-events: none;
1838 }
1839
1840 /* Compact dialog for an edit list shown in a modal — keeps the rows and the add
1841 input a comfortable, matching width. */
1842 .wpsubs-modal--editlist .wpsubs-modal__dialog {
1843 width: min(520px, calc(100vw - 40px));
1844 }
1845