PluginProbe
Subscriptions for WooCommerce with Stripe Recurring Payments / 2.3.0
Subscriptions for WooCommerce with Stripe Recurring Payments v2.3.0
2.4.0 2.3.0 2.2.0 2.1.0 2.0.0 1.11.2 1.11.1 1.11.0 1.10.9 1.10.8 1.10.7 1.10.6 1.10.5 1.10.4 1.10.3 1.10.2 1.10.1 1.10.0 1.9.6 1.9.5 trunk 1.3.0 1.3.1 1.3.2 1.4.0 All 65 releases
← All changes | assets/css/admin/onboarding-wizard.css +873 -43 1.11.0 → 2.3.0 View file →
@@ -4,21 +4,126 @@
4 4 * Extracted from includes/Admin/views/onboarding-wizard.php.
5 5 * Enqueued via includes/Admin/Menu.php (handle: subscrpt-onboarding-wizard).
6 6 */
7 7 #subscrpt-onboarding-wizard {
8 - max-width: 680px;
8 + max-width: 900px;
9 9 }
10 -#subscrpt-onboarding-wizard:has(#subscrpt-section-1.active),
11 -#subscrpt-onboarding-wizard:has(#subscrpt-section-2.active) {
12 - max-width: 900px;
10 +
11 +/* Two columns: the steps on the left, a persistent live-preview rail on the
12 + right that stays put while the steps swap. */
13 +/* One card: steps top-left, its nav footer bottom-left, and the preview
14 + spanning the full height of the right column. */
15 +.wpsubs-wizard-layout {
16 + display: grid;
17 + grid-template-columns: minmax(0, 1fr) 420px;
18 + grid-template-rows: 1fr auto;
19 + grid-template-areas:
20 + "steps preview"
21 + "footer preview";
22 + background: var(--wpsubs-surface, #fff);
23 + border: 1px solid var(--wpsubs-border, #e5e7eb);
24 + border-radius: var(--wpsubs-radius, 8px);
25 + box-shadow: var(--wpsubs-shadow, 0 1px 3px rgba(0, 0, 0, 0.08));
13 26 }
14 -/* Page sections — all rendered, JS toggles visibility */
27 +.wpsubs-wizard-steps {
28 + grid-area: steps;
29 + min-width: 0;
30 + padding: 28px 32px;
31 +}
32 +.wpsubs-wizard-aside {
33 + grid-area: preview;
34 + display: flex;
35 + flex-direction: column;
36 + justify-content: center;
37 + padding: 28px 32px;
38 + border-left: 1px solid var(--wpsubs-border, #e5e7eb);
39 +}
40 +.wpsubs-preview {
41 + width: 100%;
42 +}
43 +/* Footer carries the step's Back / Continue buttons, under the steps only. */
44 +.wpsubs-wizard-footer {
45 + grid-area: footer;
46 + border-top: 1px solid var(--wpsubs-border, #e5e7eb);
47 + padding: 16px 32px;
48 +}
49 +.wpsubs-wizard-nav {
50 + display: flex;
51 + align-items: center;
52 + justify-content: space-between;
53 + gap: 12px;
54 +}
55 +/* `display: flex` outweighs the bare `hidden` attribute, so restate it. */
56 +.wpsubs-wizard-nav[hidden] {
57 + display: none;
58 +}
59 +/* Grouped secondary links on the finish step (left of the Finish button). */
60 +.wpsubs-wizard-nav__group {
61 + display: flex;
62 + gap: 12px;
63 +}
64 +.wpsubs-preview__label {
65 + margin: 0 0 2px;
66 + font-size: 11px;
67 + font-weight: 700;
68 + letter-spacing: 0.08em;
69 + text-transform: uppercase;
70 + color: var(--wpsubs-text-muted, #6b7280);
71 + text-align: center;
72 +}
73 +.wpsubs-preview__caption {
74 + margin: 12px 2px 0;
75 + font-size: 12px;
76 + line-height: 1.5;
77 + color: var(--wpsubs-text-muted, #6b7280);
78 + text-align: center;
79 +}
80 +@media (max-width: 900px) {
81 + .wpsubs-wizard-layout {
82 + grid-template-columns: minmax(0, 1fr);
83 + grid-template-areas:
84 + "steps"
85 + "preview"
86 + "footer";
87 + }
88 + .wpsubs-wizard-aside {
89 + justify-content: flex-start;
90 + border-left: none;
91 + border-top: 1px solid var(--wpsubs-border, #e5e7eb);
92 + }
93 +}
94 +
95 +/* Page sections — all rendered, JS toggles visibility. The active section
96 + animates in on each step change. */
15 97 .wpsubs-wizard-section {
16 98 display: none;
17 99 }
18 100 .wpsubs-wizard-section.active {
19 101 display: block;
102 + animation: wpsubs-section-in 0.35s cubic-bezier(0.22, 1, 0.36, 1) both;
20 103 }
104 +@keyframes wpsubs-section-in {
105 + from {
106 + opacity: 0;
107 + transform: translateY(10px);
108 + }
109 + to {
110 + opacity: 1;
111 + transform: translateY(0);
112 + }
113 +}
114 +@media (prefers-reduced-motion: reduce) {
115 + .wpsubs-wizard-section.active {
116 + animation: none;
117 + }
118 +}
119 +/* The welcome step animates its own inner content and hosts an absolutely
120 + positioned background layer, so it must NOT get the section-level transform —
121 + a transform would make it a containing block and shrink that background to
122 + the centered card instead of the full panel. */
123 +#subscrpt-section-0.wpsubs-wizard-section.active {
124 + animation: none;
125 +}
21 126 /* Stepper */
22 127 .wpsubs-wizard-stepper {
23 128 display: flex;
24 129 align-items: center;
@@ -87,15 +192,235 @@
87 192 background: var(--wpsubs-border);
88 193 margin: 0 8px;
89 194 }
90 195 /* Card */
196 +/* No longer its own box — it is the left half of the shared card. */
91 197 .wpsubs-wizard-card {
92 - background: var(--wpsubs-surface);
93 - border: 1px solid var(--wpsubs-border);
94 - border-radius: var(--wpsubs-radius);
95 - padding: 28px 32px;
198 + padding: 0;
96 199 margin-bottom: 16px;
97 200 }
201 +
202 +/* Welcome page (step 0): standalone intro — no preview, no footer nav. */
203 +.wpsubs-wizard-layout.is-welcome {
204 + grid-template-columns: 1fr;
205 + grid-template-areas: "steps";
206 + position: relative;
207 + overflow: hidden;
208 +}
209 +.wpsubs-wizard-layout.is-welcome .wpsubs-wizard-aside,
210 +.wpsubs-wizard-layout.is-welcome .wpsubs-wizard-footer {
211 + display: none;
212 +}
213 +/* Center the intro in the available height so it doesn't sit at the top. */
214 +.wpsubs-wizard-layout.is-welcome .wpsubs-wizard-steps {
215 + position: relative;
216 + z-index: 1;
217 + display: flex;
218 + align-items: center;
219 + justify-content: center;
220 + min-height: 500px;
221 + overflow: hidden;
222 +}
223 +/* Faint dotted texture across the whole panel. */
224 +.wpsubs-wizard-layout.is-welcome .wpsubs-wizard-steps::before {
225 + content: "";
226 + position: absolute;
227 + inset: 0;
228 + z-index: 0;
229 + background-image: radial-gradient(var(--wpsubs-border, #e5e7eb) 1px, transparent 1px);
230 + background-size: 22px 22px;
231 + -webkit-mask-image: radial-gradient(ellipse 70% 70% at 50% 45%, #000 40%, transparent 100%);
232 + mask-image: radial-gradient(ellipse 70% 70% at 50% 45%, #000 40%, transparent 100%);
233 + opacity: 0.5;
234 + pointer-events: none;
235 +}
236 +/* Two soft brand blobs drifting behind the card. */
237 +.wpsubs-welcome-bg {
238 + position: absolute;
239 + inset: 0;
240 + z-index: 0;
241 + overflow: hidden;
242 + pointer-events: none;
243 +}
244 +.wpsubs-welcome-bg::before,
245 +.wpsubs-welcome-bg::after {
246 + content: "";
247 + position: absolute;
248 + border-radius: 50%;
249 + filter: blur(48px);
250 +}
251 +.wpsubs-welcome-bg::before {
252 + width: 320px;
253 + height: 320px;
254 + top: -110px;
255 + left: -90px;
256 + background: radial-gradient(circle at 30% 30%, rgba(255, 77, 0, 0.22), transparent 70%);
257 + animation: wpsubs-welcome-float-a 13s ease-in-out infinite;
258 +}
259 +.wpsubs-welcome-bg::after {
260 + width: 360px;
261 + height: 360px;
262 + right: -120px;
263 + bottom: -140px;
264 + background: radial-gradient(circle at 60% 60%, rgba(255, 166, 133, 0.28), transparent 70%);
265 + animation: wpsubs-welcome-float-b 17s ease-in-out infinite;
266 +}
267 +@keyframes wpsubs-welcome-float-a {
268 + 0%,
269 + 100% {
270 + transform: translate(0, 0) scale(1);
271 + }
272 + 50% {
273 + transform: translate(26px, 20px) scale(1.08);
274 + }
275 +}
276 +@keyframes wpsubs-welcome-float-b {
277 + 0%,
278 + 100% {
279 + transform: translate(0, 0) scale(1);
280 + }
281 + 50% {
282 + transform: translate(-30px, -18px) scale(1.1);
283 + }
284 +}
285 +.wpsubs-welcome {
286 + position: relative;
287 + z-index: 1;
288 + max-width: 440px;
289 + margin: 0 auto;
290 + padding: 8px 0;
291 + text-align: center;
292 + animation: wpsubs-welcome-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;
293 +}
294 +@keyframes wpsubs-welcome-in {
295 + from {
296 + opacity: 0;
297 + transform: translateY(12px);
298 + }
299 + to {
300 + opacity: 1;
301 + transform: translateY(0);
302 + }
303 +}
304 +.wpsubs-welcome__logo {
305 + display: block;
306 + width: 64px;
307 + height: 64px;
308 + margin: 0 auto 20px;
309 + background: transparent;
310 + /* drop-shadow follows the icon's transparent shape (box-shadow would frame
311 + the square box and show through the transparent corners). */
312 + filter: drop-shadow(0 8px 16px rgba(255, 77, 0, 0.28));
313 + animation: wpsubs-welcome-float-logo 5.5s ease-in-out infinite;
314 +}
315 +@keyframes wpsubs-welcome-float-logo {
316 + 0%,
317 + 100% {
318 + transform: translateY(0);
319 + }
320 + 50% {
321 + transform: translateY(-6px);
322 + }
323 +}
324 +.wpsubs-welcome__title {
325 + font-size: 25px;
326 + font-weight: 800;
327 + color: var(--wpsubs-text, #374151);
328 + margin: 0 0 10px;
329 + line-height: 1.25;
330 +}
331 +.wpsubs-welcome__lead {
332 + font-size: 14px;
333 + color: var(--wpsubs-text-muted, #6b7280);
334 + line-height: 1.65;
335 + margin: 0 auto;
336 + max-width: 400px;
337 +}
338 +.wpsubs-welcome__steps {
339 + list-style: none;
340 + margin: 28px auto 0;
341 + padding: 0;
342 + text-align: left;
343 + display: grid;
344 + gap: 10px;
345 +}
346 +.wpsubs-welcome__steps li {
347 + display: flex;
348 + align-items: center;
349 + gap: 12px;
350 + padding: 13px 15px;
351 + font-size: 13.5px;
352 + font-weight: 500;
353 + color: var(--wpsubs-text, #374151);
354 + background: var(--wpsubs-surface-muted, #f9fafb);
355 + border: 1px solid var(--wpsubs-border, #e5e7eb);
356 + border-radius: var(--wpsubs-radius, 8px);
357 + transition:
358 + border-color 0.15s,
359 + box-shadow 0.15s,
360 + transform 0.15s;
361 + animation: wpsubs-welcome-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;
362 +}
363 +.wpsubs-welcome__steps li:nth-child(1) {
364 + animation-delay: 0.12s;
365 +}
366 +.wpsubs-welcome__steps li:nth-child(2) {
367 + animation-delay: 0.19s;
368 +}
369 +.wpsubs-welcome__steps li:nth-child(3) {
370 + animation-delay: 0.26s;
371 +}
372 +.wpsubs-welcome__steps li:hover {
373 + border-color: var(--wpsubs-brand, #ff4d00);
374 + box-shadow: 0 2px 10px rgba(255, 77, 0, 0.1);
375 + transform: translateX(2px);
376 +}
377 +.wpsubs-welcome__num {
378 + display: inline-flex;
379 + align-items: center;
380 + justify-content: center;
381 + flex-shrink: 0;
382 + width: 26px;
383 + height: 26px;
384 + border-radius: 50%;
385 + background: var(--wpsubs-brand, #ff4d00);
386 + color: #fff;
387 + font-size: 12px;
388 + font-weight: 700;
389 +}
390 +.wpsubs-welcome__actions {
391 + display: flex;
392 + flex-direction: column;
393 + align-items: center;
394 + gap: 12px;
395 + margin-top: 28px;
396 +}
397 +.wpsubs-btn--lg {
398 + padding: 10px 22px;
399 + font-size: 14px;
400 +}
401 +.wpsubs-welcome__skip {
402 + background: none;
403 + border: 0;
404 + padding: 0;
405 + cursor: pointer;
406 + font-size: 13px;
407 + color: var(--wpsubs-text-muted, #6b7280);
408 +}
409 +.wpsubs-welcome__skip:hover {
410 + color: var(--wpsubs-text, #374151);
411 + text-decoration: underline;
412 +}
413 +/* Respect reduced-motion: keep the layout, drop the movement. */
414 +@media (prefers-reduced-motion: reduce) {
415 + .wpsubs-welcome,
416 + .wpsubs-welcome__logo,
417 + .wpsubs-welcome__steps li,
418 + .wpsubs-welcome-bg::before,
419 + .wpsubs-welcome-bg::after {
420 + animation: none;
421 + }
422 +}
98 423 /* Form rows (shared) */
99 424 .wpsubs-form-row {
100 425 margin-bottom: 16px;
101 426 }
@@ -162,26 +487,8 @@
162 487 .wpsubs-p2-option-card.active {
163 488 border-color: var(--wpsubs-brand);
164 489 background: var(--wpsubs-brand-light);
165 490 }
166 -.wpsubs-p2-option-card__check {
167 - position: absolute;
168 - top: 10px;
169 - right: 10px;
170 - width: 20px;
171 - height: 20px;
172 - border-radius: 50%;
173 - background: var(--wpsubs-brand);
174 - display: none;
175 - align-items: center;
176 - justify-content: center;
177 - color: var(--wpsubs-surface);
178 - font-size: 11px;
179 - font-weight: 700;
180 -}
181 -.wpsubs-p2-option-card.active .wpsubs-p2-option-card__check {
182 - display: flex;
183 -}
184 491 .wpsubs-p2-option-card__icon {
185 492 width: 32px;
186 493 height: 32px;
187 494 border-radius: 6px;
@@ -315,8 +622,74 @@
315 622 color: var(--wpsubs-text-muted);
316 623 margin-top: 5px;
317 624 line-height: 1.4;
318 625 }
626 +
627 +/* Page 3: per-duration pricing rows (name + price + on/off toggle) --------- */
628 +.wpsubs-connect-dur {
629 + display: flex;
630 + align-items: center;
631 + gap: 12px;
632 + padding: 10px 12px;
633 + border: 1px solid var(--wpsubs-border, #e5e7eb);
634 + border-radius: var(--wpsubs-radius, 8px);
635 + background: var(--wpsubs-surface, #fff);
636 + margin-bottom: 8px;
637 +}
638 +.wpsubs-connect-dur:last-child {
639 + margin-bottom: 0;
640 +}
641 +.wpsubs-connect-dur__icon {
642 + display: inline-flex;
643 + align-items: center;
644 + justify-content: center;
645 + flex-shrink: 0;
646 + width: 28px;
647 + height: 28px;
648 + border-radius: 6px;
649 + background: var(--wpsubs-brand-light, #fff1eb);
650 + color: var(--wpsubs-brand, #ff4d00);
651 +}
652 +.wpsubs-connect-dur__icon svg {
653 + width: 15px;
654 + height: 15px;
655 +}
656 +.wpsubs-connect-dur__text {
657 + flex: 1;
658 + min-width: 0;
659 +}
660 +.wpsubs-connect-dur__name {
661 + margin: 0;
662 + font-size: 13px;
663 + font-weight: 600;
664 + color: var(--wpsubs-text, #374151);
665 + overflow: hidden;
666 + text-overflow: ellipsis;
667 + white-space: nowrap;
668 +}
669 +.wpsubs-connect-dur__billing {
670 + margin: 0;
671 + font-size: 11.5px;
672 + color: var(--wpsubs-text-muted, #6b7280);
673 +}
674 +.wpsubs-connect-dur__price {
675 + flex-shrink: 0;
676 + width: 104px;
677 +}
678 +.wpsubs-connect-dur__price .wpsubs-input {
679 + width: 100%;
680 +}
681 +.wpsubs-connect-dur__switch {
682 + flex-shrink: 0;
683 + display: inline-flex;
684 + align-items: center;
685 + cursor: pointer;
686 +}
687 +/* Dim the price of a duration that's toggled off. */
688 +.wpsubs-connect-dur.is-off .wpsubs-connect-dur__text,
689 +.wpsubs-connect-dur.is-off .wpsubs-connect-dur__price {
690 + opacity: 0.5;
691 +}
319 692 .wpsubs-p2-label-optional {
320 693 font-weight: 400;
321 694 color: var(--wpsubs-text-subtle);
322 695 font-size: 12px;
@@ -468,15 +841,46 @@
468 841 .wpsubs-p2-product-search__item--locked {
469 842 opacity: 0.55;
470 843 cursor: not-allowed;
471 844 }
472 -/* Billing every group — number input + standalone adv-select */
845 +/* A product already attached to a plan — not selectable. */
846 +.wpsubs-p2-product-search__item--disabled {
847 + cursor: not-allowed;
848 +}
849 +.wpsubs-p2-product-search__item--disabled:hover {
850 + background: transparent;
851 +}
852 +.wpsubs-p2-product-search__item--disabled .wpsubs-p2-product-search__avatar,
853 +.wpsubs-p2-product-search__item--disabled .wpsubs-p2-product-search__info {
854 + opacity: 0.5;
855 +}
856 +/* Inline "Added to another plan" note next to the product name (matches the
857 + Plans admin product tab). */
858 +.wpsubs-p2-product-search__connected {
859 + margin-left: 8px;
860 + font-size: 12px;
861 + font-weight: 400;
862 + font-style: italic;
863 + color: var(--wpsubs-text-muted, #6b7280);
864 +}
865 +/* Billing every group — number input + standalone adv-select, matching the
866 + plan duration editor (two separate controls with an 8px gap). */
473 867 .wpsubs-p2-billing-group {
868 + display: flex;
869 + gap: 8px;
870 + align-items: center;
474 871 width: 100%;
475 872 }
476 873 .wpsubs-p2-billing-group .wpsubs-p2-billing-per-input {
477 - flex-grow: 1;
874 + flex: 1 1 auto;
875 + min-width: 0;
478 876 }
877 +/* Locked (no Pro): frequency is fixed at 1 and not editable. */
878 +.wpsubs-p2-billing-per-input[readonly] {
879 + background: var(--wpsubs-surface-muted, #f3f4f6) !important;
880 + color: var(--wpsubs-text-muted, #6b7280);
881 + cursor: not-allowed;
882 +}
479 883 #subscrpt-billing-period-select {
480 884 width: 100%;
481 885 }
482 886 /* Pro badge + locked fields */
@@ -585,8 +989,87 @@
585 989 .wpsubs-p3-card {
586 990 text-align: center;
587 991 padding: 40px 40px 32px;
588 992 }
993 +
994 +/* Final step: working / error states -------------------------------------- */
995 +.wpsubs-finalize-progress,
996 +.wpsubs-finalize-error {
997 + text-align: center;
998 +}
999 +.wpsubs-finalize-spinner {
1000 + width: 44px;
1001 + height: 44px;
1002 + margin: 0 auto 20px;
1003 + border-radius: 50%;
1004 + border: 3px solid var(--wpsubs-brand-light, #fff1eb);
1005 + border-top-color: var(--wpsubs-brand, #ff4d00);
1006 + animation: wpsubs-finalize-spin 0.7s linear infinite;
1007 +}
1008 +@keyframes wpsubs-finalize-spin {
1009 + to {
1010 + transform: rotate(360deg);
1011 + }
1012 +}
1013 +.wpsubs-finalize-steps {
1014 + list-style: none;
1015 + margin: 4px auto 0;
1016 + padding: 0;
1017 + max-width: 260px;
1018 + text-align: left;
1019 +}
1020 +.wpsubs-finalize-steps li {
1021 + display: flex;
1022 + align-items: center;
1023 + gap: 10px;
1024 + padding: 7px 0;
1025 + font-size: 13px;
1026 + font-weight: 500;
1027 + color: var(--wpsubs-text-muted, #6b7280);
1028 +}
1029 +.wpsubs-finalize-steps__dot {
1030 + flex-shrink: 0;
1031 + width: 16px;
1032 + height: 16px;
1033 + border-radius: 50%;
1034 + border: 2px solid var(--wpsubs-border-strong, #cbd5e1);
1035 + background: var(--wpsubs-surface, #fff);
1036 + transition:
1037 + border-color 0.2s,
1038 + background 0.2s;
1039 +}
1040 +.wpsubs-finalize-steps li.is-doing {
1041 + color: var(--wpsubs-text, #374151);
1042 +}
1043 +.wpsubs-finalize-steps li.is-doing .wpsubs-finalize-steps__dot {
1044 + border-color: var(--wpsubs-brand, #ff4d00);
1045 + border-top-color: transparent;
1046 + animation: wpsubs-finalize-spin 0.7s linear infinite;
1047 +}
1048 +.wpsubs-finalize-steps li.is-done {
1049 + color: var(--wpsubs-text, #374151);
1050 +}
1051 +.wpsubs-finalize-steps li.is-done .wpsubs-finalize-steps__dot {
1052 + border-color: var(--wpsubs-brand, #ff4d00);
1053 + background: var(--wpsubs-brand, #ff4d00)
1054 + 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='%23fff' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round' fill='none'/%3E%3C/svg%3E")
1055 + center / 11px no-repeat;
1056 +}
1057 +.wpsubs-finalize-error__icon {
1058 + width: 52px;
1059 + height: 52px;
1060 + border-radius: 50%;
1061 + display: flex;
1062 + align-items: center;
1063 + justify-content: center;
1064 + margin: 0 auto 20px;
1065 + background: #fee2e2;
1066 + color: #dc2626;
1067 +}
1068 +.wpsubs-finalize-error .wpsubs-btn {
1069 + margin-top: 4px;
1070 +}
1071 +
589 1072 .wpsubs-p3-success-icon {
590 1073 width: 52px;
591 1074 height: 52px;
592 1075 border-radius: 50%;
@@ -804,18 +1287,8 @@
804 1287 height: 36px;
805 1288 box-sizing: border-box;
806 1289 }
807 1290 /* Page 1 specific — two-column hero layout */
808 -#subscrpt-section-1 {
809 - max-width: 860px;
810 -}
811 -#subscrpt-section-1 .wpsubs-wizard-card {
812 - padding: 56px 48px;
813 - display: grid;
814 - grid-template-columns: 1fr 1fr;
815 - gap: 64px;
816 - align-items: center;
817 -}
818 1291 .wpsubs-p1-left {
819 1292 display: flex;
820 1293 flex-direction: column;
821 1294 gap: 0;
@@ -1013,12 +1486,369 @@
1013 1486 align-items: center;
1014 1487 justify-content: flex-end;
1015 1488 gap: 4px;
1016 1489 }
1017 -@media (max-width: 680px) {
1018 - #subscrpt-section-1 .wpsubs-wizard-card {
1490 +@media (max-width: 782px) {
1491 + /* Stack the two-column body (form + preview/summary) on narrow screens. */
1492 + .wpsubs-p2-body {
1019 1493 grid-template-columns: 1fr;
1494 + gap: 20px;
1020 1495 }
1021 - .wpsubs-p1-right {
1022 - display: none;
1496 + .wpsubs-p2-preview-col {
1497 + position: static;
1023 1498 }
1499 +}
1500 +
1501 +/* Page 1 animated plan-structure preview (right column):
1502 + one Plan -> three Durations -> two Products, joined by flowing lines. */
1503 +.wpsubs-p1-graph {
1504 + position: relative;
1505 + /* Fluid: fill the preview column instead of a fixed pixel box, so the nodes
1506 + scale with the rail rather than needing a wider container. */
1507 + width: 100%;
1508 + aspect-ratio: 300 / 420;
1509 + margin: 10px auto 0;
1510 +}
1511 +.wpsubs-p1-graph__lines {
1512 + position: absolute;
1513 + inset: 0;
1514 + width: 100%;
1515 + height: 100%;
1516 + overflow: visible;
1517 +}
1518 +.wpsubs-p1-flow {
1519 + fill: none;
1520 + /* Muted by default; a line only turns brand-orange once the duration it
1521 + belongs to is filled (.is-active, toggled from JS). */
1522 + stroke: var(--wpsubs-border, #e5e7eb);
1523 + stroke-width: 1.5;
1524 + stroke-linecap: round;
1525 + stroke-dasharray: 3 6;
1526 + opacity: 0.35;
1527 +}
1528 +.wpsubs-p1-flow.is-active {
1529 + stroke: var(--wpsubs-brand, #ff4d00);
1530 + opacity: 0.55;
1531 + animation: wpsubs-p1-flow 0.9s linear infinite;
1532 +}
1533 +@keyframes wpsubs-p1-flow {
1534 + to {
1535 + stroke-dashoffset: -9;
1536 + }
1537 +}
1538 +
1539 +.wpsubs-p1-node {
1540 + position: absolute;
1541 + z-index: 1;
1542 + display: flex;
1543 + align-items: center;
1544 + gap: 8px;
1545 + box-sizing: border-box;
1546 + padding: 10px 12px;
1547 + background: var(--wpsubs-surface, #fff);
1548 + border: 1px solid var(--wpsubs-border, #e5e7eb);
1549 + border-radius: 9px;
1550 + box-shadow: 0 1px 3px rgba(15, 23, 42, 0.08);
1551 + font-size: 12px;
1552 + font-weight: 600;
1553 + color: var(--wpsubs-text, #374151);
1554 + line-height: 1.2;
1555 + white-space: nowrap;
1556 + overflow: hidden;
1557 + transform-origin: center;
1558 + transition:
1559 + transform 0.2s ease,
1560 + box-shadow 0.2s ease,
1561 + border-color 0.12s ease;
1562 +}
1563 +.wpsubs-p1-node__icon {
1564 + display: inline-flex;
1565 + align-items: center;
1566 + justify-content: center;
1567 + flex-shrink: 0;
1568 + width: 24px;
1569 + height: 24px;
1570 + border-radius: 6px;
1571 + background: var(--wpsubs-surface-muted, #f3f4f6);
1572 + color: var(--wpsubs-text-muted, #6b7280);
1573 +}
1574 +.wpsubs-p1-node__icon svg {
1575 + width: 14px;
1576 + height: 14px;
1577 +}
1578 +.wpsubs-p1-node__label {
1579 + overflow: hidden;
1580 + text-overflow: ellipsis;
1581 +}
1582 +/* Two-line node body: title over a muted subtitle. */
1583 +.wpsubs-p1-node__text {
1584 + display: flex;
1585 + flex-direction: column;
1586 + gap: 1px;
1587 + min-width: 0;
1588 +}
1589 +.wpsubs-p1-node__title {
1590 + font-size: 12px;
1591 + font-weight: 600;
1592 + line-height: 1.25;
1593 + overflow: hidden;
1594 + text-overflow: ellipsis;
1595 + white-space: nowrap;
1596 +}
1597 +.wpsubs-p1-node__sub {
1598 + font-size: 10px;
1599 + font-weight: 500;
1600 + line-height: 1.3;
1601 + color: var(--wpsubs-text-muted, #6b7280);
1602 + overflow: hidden;
1603 + text-overflow: ellipsis;
1604 + white-space: nowrap;
1605 +}
1606 +.wpsubs-p1-node--plan .wpsubs-p1-node__sub {
1607 + color: var(--wpsubs-brand, #ff4d00);
1608 + opacity: 0.85;
1609 +}
1610 +
1611 +/* Plan node — brand accent, top of the fan-out. Widths are a % of the graph so
1612 + they scale with the column. */
1613 +.wpsubs-p1-node--plan {
1614 + width: 58%;
1615 + border-color: var(--wpsubs-brand, #ff4d00);
1616 + background: var(--wpsubs-brand-light, #fff1eb);
1617 + color: var(--wpsubs-brand-dark, #d93f00);
1618 +}
1619 +.wpsubs-p1-node--plan .wpsubs-p1-node__icon {
1620 + background: var(--wpsubs-brand, #ff4d00);
1621 + color: #fff;
1622 +}
1623 +/* Durations (x3) — narrower, so tighten padding/icon to keep text room. */
1624 +.wpsubs-p1-node--dur {
1625 + width: 30%;
1626 + padding: 8px 9px;
1627 + gap: 6px;
1628 +}
1629 +.wpsubs-p1-node--dur .wpsubs-p1-node__icon {
1630 + width: 20px;
1631 + height: 20px;
1632 +}
1633 +/* Products (x2). */
1634 +.wpsubs-p1-node--prod {
1635 + width: 44%;
1636 +}
1637 +
1638 +/* Ghost nodes — the "you can add more later" placeholders. */
1639 +.wpsubs-p1-node--ghost {
1640 + opacity: 0.45;
1641 + border-style: dashed;
1642 + box-shadow: none;
1643 +}
1644 +/* The product card stays muted on the plan/duration steps and only comes to
1645 + life on the connect step (and after). */
1646 +.wpsubs-p1-graph:not([data-active="prod"]):not([data-active="done"]) .wpsubs-p1-node--prod:not(.wpsubs-p1-node--ghost) {
1647 + opacity: 0.45;
1648 + border-style: dashed;
1649 + box-shadow: none;
1650 +}
1651 +
1652 +/* The group belonging to the current step gets a brand ring. Ghosts never
1653 + light up — only the node the step actually fills in. */
1654 +.wpsubs-p1-graph[data-active="plan"] .wpsubs-p1-node--plan,
1655 +.wpsubs-p1-graph[data-active="dur"] .wpsubs-p1-node--dur:not(.wpsubs-p1-node--ghost),
1656 +.wpsubs-p1-graph[data-active="prod"] .wpsubs-p1-node--prod:not(.wpsubs-p1-node--ghost) {
1657 + border-color: var(--wpsubs-brand, #ff4d00);
1658 + background: var(--wpsubs-brand-light, #fff1eb);
1659 + box-shadow: 0 0 0 3px var(--wpsubs-brand-ring, rgba(255, 77, 0, 0.22));
1660 + animation: wpsubs-p1-pulse 1.6s ease-in-out infinite;
1661 +}
1662 +/* Keep the subtitle readable on the tinted background. */
1663 +.wpsubs-p1-graph[data-active="dur"] .wpsubs-p1-node--dur:not(.wpsubs-p1-node--ghost) .wpsubs-p1-node__sub,
1664 +.wpsubs-p1-graph[data-active="prod"] .wpsubs-p1-node--prod:not(.wpsubs-p1-node--ghost) .wpsubs-p1-node__sub {
1665 + color: var(--wpsubs-brand-dark, #d93f00);
1666 +}
1667 +/* Past the durations step, the set duration cards keep a static brand tint
1668 + (no pulse) — the same way the plan card stays coloured after step 1. */
1669 +.wpsubs-p1-graph[data-active="prod"] .wpsubs-p1-node--dur:not(.wpsubs-p1-node--ghost),
1670 +.wpsubs-p1-graph[data-active="done"] .wpsubs-p1-node--dur:not(.wpsubs-p1-node--ghost),
1671 +.wpsubs-p1-graph[data-active="done"] .wpsubs-p1-node--prod:not(.wpsubs-p1-node--ghost) {
1672 + border-color: var(--wpsubs-brand, #ff4d00);
1673 + background: var(--wpsubs-brand-light, #fff1eb);
1674 +}
1675 +.wpsubs-p1-graph[data-active="prod"] .wpsubs-p1-node--dur:not(.wpsubs-p1-node--ghost) .wpsubs-p1-node__sub,
1676 +.wpsubs-p1-graph[data-active="done"] .wpsubs-p1-node--dur:not(.wpsubs-p1-node--ghost) .wpsubs-p1-node__sub,
1677 +.wpsubs-p1-graph[data-active="done"] .wpsubs-p1-node--prod:not(.wpsubs-p1-node--ghost) .wpsubs-p1-node__sub {
1678 + color: var(--wpsubs-brand-dark, #d93f00);
1679 +}
1680 +@keyframes wpsubs-p1-pulse {
1681 + 0%,
1682 + 100% {
1683 + box-shadow: 0 0 0 3px var(--wpsubs-brand-ring, rgba(255, 77, 0, 0.22));
1684 + }
1685 + 50% {
1686 + box-shadow: 0 0 0 5px rgba(255, 77, 0, 0.1);
1687 + }
1688 +}
1689 +
1690 +/* Zoom the card whose field is currently focused (wins over the pulse). */
1691 +.wpsubs-p1-graph[data-focus="plan"] .wpsubs-p1-node--plan,
1692 +.wpsubs-p1-graph[data-focus="prod"] .wpsubs-p1-node--prod:not(.wpsubs-p1-node--ghost),
1693 +.wpsubs-p1-node.is-zoom:not(.wpsubs-p1-node--ghost) {
1694 + transform: scale(1.14);
1695 + z-index: 3;
1696 + border-color: var(--wpsubs-brand, #ff4d00);
1697 + box-shadow: 0 10px 22px rgba(255, 77, 0, 0.2);
1698 + animation: none;
1699 +}
1700 +
1701 +@media (prefers-reduced-motion: reduce) {
1702 + .wpsubs-p1-flow,
1703 + .wpsubs-p1-graph .wpsubs-p1-node {
1704 + animation: none;
1705 + }
1706 +}
1707 +
1708 +/* Button loading state (plan create / connect requests in flight). */
1709 +.wpsubs-btn.is-loading {
1710 + opacity: 0.6;
1711 + cursor: progress;
1712 + pointer-events: none;
1713 +}
1714 +
1715 +/* Free-trial line in the step-2 plan preview. */
1716 +.wpsubs-p1-preview-trial {
1717 + margin: 6px 0 0;
1718 + font-size: 12px;
1719 + font-weight: 600;
1720 + color: #15803d;
1721 +}
1722 +
1723 +/* Pro-locked plan-type cards on the create-plan step. */
1724 +.wpsubs-p2-option-card:disabled {
1725 + opacity: 0.55;
1726 + cursor: not-allowed;
1727 +}
1728 +
1729 +/* List layout for the plan-type cards (create-plan step): each row is
1730 + icon + text, full width, with the check centered on the right. */
1731 +.wpsubs-p2-option-cards--list {
1732 + display: flex;
1733 + flex-direction: column;
1734 + gap: 8px;
1735 +}
1736 +.wpsubs-p2-option-cards--list .wpsubs-p2-option-card {
1737 + flex-direction: row;
1738 + align-items: center;
1739 + gap: 12px;
1740 + padding: 12px 44px 12px 16px;
1741 +}
1742 +.wpsubs-p2-option-cards--list .wpsubs-p2-option-card__icon {
1743 + margin-bottom: 0;
1744 + flex-shrink: 0;
1745 +}
1746 +.wpsubs-p2-option-card__text {
1747 + min-width: 0;
1748 +}
1749 +
1750 +/* Compact option cards (connect step): horizontal icon + title, no description,
1751 + so the two choices stay small. */
1752 +.wpsubs-p2-option-cards--compact .wpsubs-p2-option-card {
1753 + flex-direction: row;
1754 + align-items: center;
1755 + gap: 10px;
1756 + padding: 10px 12px;
1757 +}
1758 +.wpsubs-p2-option-cards--compact .wpsubs-p2-option-card__icon {
1759 + width: 28px;
1760 + height: 28px;
1761 + margin-bottom: 0;
1762 + flex-shrink: 0;
1763 +}
1764 +.wpsubs-p2-option-cards--compact .wpsubs-p2-option-card__title {
1765 + font-size: 12.5px;
1766 +}
1767 +
1768 +/* Durations accordion (step 2). */
1769 +.wpsubs-dur {
1770 + border: 1px solid var(--wpsubs-border, #e5e7eb);
1771 + border-radius: var(--wpsubs-radius, 8px);
1772 + background: var(--wpsubs-surface, #fff);
1773 + margin-bottom: 10px;
1774 +}
1775 +.wpsubs-dur__head {
1776 + display: flex;
1777 + align-items: center;
1778 + gap: 10px;
1779 + padding: 12px 14px;
1780 + cursor: pointer;
1781 + user-select: none;
1782 +}
1783 +.wpsubs-dur.is-open .wpsubs-dur__head {
1784 + border-bottom: 1px solid var(--wpsubs-border, #e5e7eb);
1785 +}
1786 +.wpsubs-dur__icon {
1787 + display: inline-flex;
1788 + align-items: center;
1789 + justify-content: center;
1790 + flex-shrink: 0;
1791 + width: 28px;
1792 + height: 28px;
1793 + border-radius: 6px;
1794 + background: var(--wpsubs-brand-light, #fff1eb);
1795 + color: var(--wpsubs-brand, #ff4d00);
1796 +}
1797 +.wpsubs-dur__icon svg {
1798 + width: 15px;
1799 + height: 15px;
1800 +}
1801 +.wpsubs-dur__title {
1802 + flex: 1 1 auto;
1803 + min-width: 0;
1804 + font-size: 13.5px;
1805 + font-weight: 600;
1806 + color: var(--wpsubs-text, #374151);
1807 + overflow: hidden;
1808 + text-overflow: ellipsis;
1809 + white-space: nowrap;
1810 +}
1811 +.wpsubs-dur__remove {
1812 + display: none;
1813 + align-items: center;
1814 + justify-content: center;
1815 + flex-shrink: 0;
1816 + width: 24px;
1817 + height: 24px;
1818 + border: none;
1819 + background: none;
1820 + border-radius: 5px;
1821 + color: var(--wpsubs-text-subtle, #9ca3af);
1822 + font-size: 20px;
1823 + line-height: 1;
1824 + cursor: pointer;
1825 + transition:
1826 + color 0.12s,
1827 + background 0.12s;
1828 +}
1829 +.wpsubs-dur__remove:hover {
1830 + color: #dc2626;
1831 + background: #fef2f2;
1832 +}
1833 +#subscrpt-durations.has-multiple .wpsubs-dur__remove {
1834 + display: inline-flex;
1835 +}
1836 +.wpsubs-dur__chevron {
1837 + flex-shrink: 0;
1838 + color: var(--wpsubs-text-subtle, #9ca3af);
1839 + transition: transform 0.18s ease;
1840 +}
1841 +.wpsubs-dur.is-open .wpsubs-dur__chevron {
1842 + transform: rotate(180deg);
1843 +}
1844 +.wpsubs-dur__body {
1845 + padding: 14px;
1846 +}
1847 +.wpsubs-dur:not(.is-open) .wpsubs-dur__body {
1848 + display: none;
1849 +}
1850 +/* Cadence picker keeps its content width; the number input flexes to fill the
1851 + rest, so the picker never gets squeezed. */
1852 +.wpsubs-dur__interval {
1853 + flex: 0 0 auto;
1024 1854 }