@churnkey/react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,760 @@
1
+ /* Churnkey Cancel Flow.
2
+ All rules are scoped under .ck-cancel-flow so consumer-app bare-element
3
+ styles (e.g. `h2 { ... }` in a Vite/CRA template's index.css) can't bleed
4
+ into the modal. We don't use @layer — layered rules lose to unlayered
5
+ ones regardless of specificity, which would let those same bare-element
6
+ rules win. */
7
+
8
+ @keyframes ck-spin {
9
+ to {
10
+ transform: rotate(360deg);
11
+ }
12
+ }
13
+
14
+ /* --- Design tokens (CSS custom properties) ---
15
+ Consumers override via the `appearance` prop or by setting these vars
16
+ on a wrapping element. The values below are the SDK's defaults — a
17
+ warm-neutral palette with a single indigo accent. */
18
+ .ck-cancel-flow {
19
+ /* Surfaces */
20
+ --ck-color-bg: #fafaf9;
21
+ --ck-color-surface: #ffffff;
22
+ --ck-color-surface-muted: #f5f5f4;
23
+
24
+ /* Borders */
25
+ --ck-color-border: #e7e5e4;
26
+ --ck-color-border-strong: #d6d3d1;
27
+
28
+ /* Text */
29
+ --ck-color-text: #0c0a09;
30
+ --ck-color-text-secondary: #57534e;
31
+ --ck-color-text-muted: #a8a29e;
32
+
33
+ /* Accent — single restrained hue. */
34
+ --ck-color-primary: #4f46e5;
35
+ --ck-color-primary-hover: #4338ca;
36
+ --ck-color-primary-soft: #eef2ff;
37
+
38
+ /* Semantics — used sparingly. */
39
+ --ck-color-success: #059669;
40
+ --ck-color-success-soft: #ecfdf5;
41
+ --ck-color-danger: #dc2626;
42
+ --ck-color-danger-hover: #b91c1c;
43
+ --ck-color-danger-soft: #fef2f2;
44
+
45
+ /* Typography */
46
+ --ck-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, system-ui, sans-serif;
47
+ --ck-font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace;
48
+ --ck-font-size: 14px;
49
+
50
+ /* Geometry */
51
+ --ck-radius-sm: 6px;
52
+ --ck-radius-md: 8px;
53
+ --ck-radius-lg: 12px;
54
+ --ck-radius-xl: 16px;
55
+ --ck-border-radius: var(--ck-radius-lg);
56
+
57
+ /* Motion */
58
+ --ck-motion-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
59
+ --ck-motion-base: 200ms cubic-bezier(0.4, 0, 0.2, 1);
60
+
61
+ font-family: var(--ck-font-family);
62
+ font-size: var(--ck-font-size);
63
+ color: var(--ck-color-text);
64
+ line-height: 1.5;
65
+ }
66
+
67
+ /* --- Dark scheme ---
68
+ Applied when CancelFlow resolves `colorScheme: 'dark' | 'auto'` to
69
+ dark. Inverts surfaces and lifts the accent so it reads against the
70
+ darker backgrounds. `appearance.variables` overrides apply on top of
71
+ these via inline style — same brand color in both schemes by default. */
72
+ .ck-cancel-flow[data-color-scheme="dark"] {
73
+ --ck-color-bg: #0c0a09;
74
+ --ck-color-surface: #1c1917;
75
+ --ck-color-surface-muted: #292524;
76
+
77
+ --ck-color-border: #44403c;
78
+ --ck-color-border-strong: #57534e;
79
+
80
+ --ck-color-text: #fafaf9;
81
+ --ck-color-text-secondary: #a8a29e;
82
+ --ck-color-text-muted: #78716c;
83
+
84
+ --ck-color-primary: #818cf8;
85
+ --ck-color-primary-hover: #a5b4fc;
86
+ --ck-color-primary-soft: rgba(129, 140, 248, 0.18);
87
+
88
+ --ck-color-success: #34d399;
89
+ --ck-color-success-soft: rgba(52, 211, 153, 0.16);
90
+ --ck-color-danger: #f87171;
91
+ --ck-color-danger-hover: #fca5a5;
92
+ --ck-color-danger-soft: rgba(248, 113, 113, 0.16);
93
+ }
94
+
95
+ /* --- Scoped reset ---
96
+ Specificity (0,1,0). The class rules below all sit at (0,2,0) so they
97
+ override this for the properties they care about. The reset only kicks
98
+ in for properties a class rule doesn't set, which is where consumer
99
+ bare-element styles (e.g. `h2 { font-family: ... }`) would otherwise
100
+ leak through. `font: inherit` covers font-family / size / weight / line-
101
+ height in one go — they all inherit from `.ck-cancel-flow`'s defaults
102
+ and any explicit override on a class rule still wins. */
103
+ .ck-cancel-flow *,
104
+ .ck-cancel-flow *::before,
105
+ .ck-cancel-flow *::after {
106
+ box-sizing: border-box;
107
+ margin: 0;
108
+ padding: 0;
109
+ font: inherit;
110
+ color: inherit;
111
+ background: none;
112
+ border: 0;
113
+ text-align: inherit;
114
+ }
115
+
116
+ /* --- Overlay --- */
117
+ .ck-cancel-flow .ck-overlay {
118
+ position: fixed;
119
+ inset: 0;
120
+ display: flex;
121
+ align-items: center;
122
+ justify-content: center;
123
+ background: rgba(12, 10, 9, 0.5);
124
+ z-index: 9999;
125
+ }
126
+
127
+ /* --- Focus --- */
128
+ .ck-cancel-flow .ck-overlay :focus-visible {
129
+ outline: 2px solid var(--ck-color-primary);
130
+ outline-offset: 2px;
131
+ }
132
+
133
+ .ck-cancel-flow .ck-modal:focus {
134
+ outline: none;
135
+ }
136
+
137
+ /* --- Modal --- */
138
+ .ck-cancel-flow .ck-modal {
139
+ background: var(--ck-color-surface);
140
+ border-radius: var(--ck-radius-xl);
141
+ box-shadow:
142
+ 0 20px 25px -5px rgba(12, 10, 9, 0.1),
143
+ 0 8px 10px -6px rgba(12, 10, 9, 0.06);
144
+ width: 100%;
145
+ max-width: 440px;
146
+ max-height: 90vh;
147
+ overflow-y: auto;
148
+ position: relative;
149
+ }
150
+
151
+ /* The default modal shadow is built for white surfaces; deepen it on */
152
+ /* dark so it reads as elevation rather than a black bar. */
153
+ .ck-cancel-flow[data-color-scheme="dark"] .ck-modal {
154
+ box-shadow:
155
+ 0 20px 25px -5px rgba(0, 0, 0, 0.5),
156
+ 0 8px 10px -6px rgba(0, 0, 0, 0.4);
157
+ }
158
+
159
+ /* --- Close button (sole chrome element) --- */
160
+ .ck-cancel-flow .ck-close-button {
161
+ position: absolute;
162
+ top: 12px;
163
+ right: 12px;
164
+ display: flex;
165
+ align-items: center;
166
+ justify-content: center;
167
+ width: 32px;
168
+ height: 32px;
169
+ border: none;
170
+ background: none;
171
+ color: var(--ck-color-text-muted);
172
+ cursor: pointer;
173
+ border-radius: var(--ck-radius-sm);
174
+ transition:
175
+ background var(--ck-motion-fast),
176
+ color var(--ck-motion-fast);
177
+ z-index: 1;
178
+ }
179
+
180
+ .ck-cancel-flow .ck-close-button:hover {
181
+ background: var(--ck-color-surface-muted);
182
+ color: var(--ck-color-text);
183
+ }
184
+
185
+ /* --- Back link (inline above the step title) --- */
186
+ .ck-cancel-flow .ck-back-button {
187
+ display: inline-flex;
188
+ align-items: center;
189
+ gap: 4px;
190
+ padding: 4px 8px 4px 6px;
191
+ margin: 0 0 12px -6px;
192
+ border: none;
193
+ background: none;
194
+ color: var(--ck-color-text-muted);
195
+ font-family: inherit;
196
+ font-size: 13px;
197
+ font-weight: 500;
198
+ cursor: pointer;
199
+ border-radius: var(--ck-radius-sm);
200
+ transition: color var(--ck-motion-fast);
201
+ }
202
+
203
+ .ck-cancel-flow .ck-back-button:hover {
204
+ color: var(--ck-color-text);
205
+ }
206
+
207
+ /* --- Content --- */
208
+ .ck-cancel-flow .ck-content {
209
+ /* Top padding leaves room for the absolute-positioned close button. */
210
+ padding: 32px 24px 24px;
211
+ }
212
+
213
+ /* --- Error banner --- */
214
+ .ck-cancel-flow .ck-error {
215
+ padding: 10px 14px;
216
+ margin-bottom: 16px;
217
+ background: var(--ck-color-danger-soft);
218
+ border-radius: var(--ck-radius-md);
219
+ }
220
+
221
+ .ck-cancel-flow .ck-error-message {
222
+ font-size: 13px;
223
+ color: var(--ck-color-danger);
224
+ font-weight: 500;
225
+ }
226
+
227
+ /* --- Steps (shared) --- */
228
+ /* Plain block: an earlier flex-column rule broke text-align centering on */
229
+ /* the success step (inline-flex children stuck to the cross-axis start). */
230
+ .ck-cancel-flow .ck-step {
231
+ display: block;
232
+ }
233
+
234
+ .ck-cancel-flow .ck-step-title {
235
+ font-size: 22px;
236
+ font-weight: 600;
237
+ letter-spacing: -0.015em;
238
+ color: var(--ck-color-text);
239
+ margin: 0 0 8px;
240
+ }
241
+
242
+ .ck-cancel-flow .ck-step-description {
243
+ font-size: 14px;
244
+ color: var(--ck-color-text-secondary);
245
+ line-height: 1.55;
246
+ margin: 0 0 20px;
247
+ }
248
+
249
+ /* --- Buttons --- */
250
+ .ck-cancel-flow .ck-button {
251
+ display: inline-flex;
252
+ align-items: center;
253
+ justify-content: center;
254
+ width: 100%;
255
+ padding: 12px 20px;
256
+ font-size: 14px;
257
+ font-weight: 600;
258
+ font-family: inherit;
259
+ border: none;
260
+ border-radius: var(--ck-radius-md);
261
+ cursor: pointer;
262
+ transition: background var(--ck-motion-fast);
263
+ }
264
+
265
+ .ck-cancel-flow .ck-button:disabled {
266
+ cursor: not-allowed;
267
+ }
268
+
269
+ .ck-cancel-flow .ck-button-primary {
270
+ background: var(--ck-color-primary);
271
+ color: #ffffff;
272
+ }
273
+
274
+ .ck-cancel-flow .ck-button-primary:hover:not(:disabled) {
275
+ background: var(--ck-color-primary-hover);
276
+ }
277
+
278
+ .ck-cancel-flow .ck-button-primary:disabled {
279
+ background: var(--ck-color-surface-muted);
280
+ color: var(--ck-color-text-muted);
281
+ }
282
+
283
+ .ck-cancel-flow .ck-button-danger {
284
+ background: var(--ck-color-surface);
285
+ color: var(--ck-color-danger);
286
+ border: 1px solid var(--ck-color-danger);
287
+ }
288
+
289
+ .ck-cancel-flow .ck-button-danger:hover:not(:disabled) {
290
+ background: var(--ck-color-danger-soft);
291
+ }
292
+
293
+ .ck-cancel-flow .ck-button-link {
294
+ display: block;
295
+ width: 100%;
296
+ padding: 10px;
297
+ font-size: 13px;
298
+ font-weight: 500;
299
+ font-family: inherit;
300
+ color: var(--ck-color-text-secondary);
301
+ background: none;
302
+ border: none;
303
+ cursor: pointer;
304
+ text-align: center;
305
+ margin-top: 4px;
306
+ transition: color var(--ck-motion-fast);
307
+ }
308
+
309
+ .ck-cancel-flow .ck-button-link:hover {
310
+ color: var(--ck-color-text);
311
+ }
312
+
313
+ /* --- Survey: numbered cards --- */
314
+ .ck-cancel-flow .ck-reason-list {
315
+ display: flex;
316
+ flex-direction: column;
317
+ gap: 8px;
318
+ margin-bottom: 20px;
319
+ }
320
+
321
+ .ck-cancel-flow .ck-reason-button {
322
+ display: flex;
323
+ align-items: center;
324
+ gap: 12px;
325
+ width: 100%;
326
+ text-align: left;
327
+ padding: 12px 14px;
328
+ font-size: 14px;
329
+ font-weight: 500;
330
+ font-family: inherit;
331
+ border: 1px solid var(--ck-color-border);
332
+ border-radius: var(--ck-radius-md);
333
+ background: var(--ck-color-surface);
334
+ color: var(--ck-color-text);
335
+ cursor: pointer;
336
+ transition:
337
+ border-color var(--ck-motion-fast),
338
+ box-shadow var(--ck-motion-fast);
339
+ }
340
+
341
+ .ck-cancel-flow .ck-reason-button:hover {
342
+ border-color: var(--ck-color-border-strong);
343
+ }
344
+
345
+ .ck-cancel-flow .ck-reason-button--selected {
346
+ border-color: var(--ck-color-primary);
347
+ box-shadow:
348
+ 0 1px 2px rgba(12, 10, 9, 0.04),
349
+ 0 1px 3px rgba(12, 10, 9, 0.06);
350
+ }
351
+
352
+ .ck-cancel-flow .ck-reason-badge {
353
+ flex-shrink: 0;
354
+ width: 24px;
355
+ height: 24px;
356
+ border-radius: var(--ck-radius-sm);
357
+ display: flex;
358
+ align-items: center;
359
+ justify-content: center;
360
+ background: var(--ck-color-surface-muted);
361
+ color: var(--ck-color-text-secondary);
362
+ font-size: 11px;
363
+ font-weight: 600;
364
+ font-family: var(--ck-font-mono);
365
+ transition: background var(--ck-motion-fast);
366
+ }
367
+
368
+ .ck-cancel-flow .ck-reason-button--selected .ck-reason-badge {
369
+ background: var(--ck-color-primary);
370
+ color: #ffffff;
371
+ }
372
+
373
+ .ck-cancel-flow .ck-reason-label {
374
+ font-weight: 500;
375
+ color: var(--ck-color-text);
376
+ }
377
+
378
+ /* --- Offer step --- */
379
+ .ck-cancel-flow .ck-offer-card {
380
+ display: flex;
381
+ flex-direction: column;
382
+ }
383
+
384
+ .ck-cancel-flow .ck-offer-details {
385
+ margin-bottom: 20px;
386
+ }
387
+
388
+ /* Discount: centered phrase in a soft tinted panel. */
389
+ .ck-cancel-flow .ck-offer-discount {
390
+ background: var(--ck-color-primary-soft);
391
+ border-radius: var(--ck-radius-lg);
392
+ padding: 24px 20px;
393
+ text-align: center;
394
+ }
395
+
396
+ .ck-cancel-flow .ck-offer-discount-eyebrow {
397
+ font-size: 11px;
398
+ font-weight: 600;
399
+ letter-spacing: 0.08em;
400
+ text-transform: uppercase;
401
+ color: var(--ck-color-primary);
402
+ margin-bottom: 12px;
403
+ }
404
+
405
+ .ck-cancel-flow .ck-offer-discount-phrase {
406
+ font-size: 26px;
407
+ font-weight: 600;
408
+ letter-spacing: -0.015em;
409
+ line-height: 1.2;
410
+ color: var(--ck-color-text);
411
+ }
412
+
413
+ /* Pause: segmented duration + resume-date callout. */
414
+ .ck-cancel-flow .ck-pause-segments {
415
+ display: grid;
416
+ gap: 6px;
417
+ background: var(--ck-color-surface-muted);
418
+ padding: 4px;
419
+ border-radius: var(--ck-radius-md);
420
+ margin-bottom: 12px;
421
+ }
422
+
423
+ .ck-cancel-flow .ck-pause-segment {
424
+ appearance: none;
425
+ padding: 10px 8px;
426
+ border: none;
427
+ border-radius: var(--ck-radius-sm);
428
+ background: transparent;
429
+ font-size: 14px;
430
+ font-weight: 600;
431
+ font-family: inherit;
432
+ color: var(--ck-color-text-secondary);
433
+ cursor: pointer;
434
+ transition: all var(--ck-motion-fast);
435
+ }
436
+
437
+ .ck-cancel-flow .ck-pause-segment--selected {
438
+ background: var(--ck-color-surface);
439
+ color: var(--ck-color-text);
440
+ box-shadow:
441
+ 0 1px 2px rgba(12, 10, 9, 0.04),
442
+ 0 1px 3px rgba(12, 10, 9, 0.06);
443
+ }
444
+
445
+ .ck-cancel-flow .ck-pause-resume {
446
+ display: flex;
447
+ justify-content: space-between;
448
+ align-items: center;
449
+ padding: 12px 16px;
450
+ background: var(--ck-color-primary-soft);
451
+ border-radius: var(--ck-radius-md);
452
+ }
453
+
454
+ .ck-cancel-flow .ck-pause-resume-label {
455
+ font-size: 11px;
456
+ font-weight: 600;
457
+ letter-spacing: 0.06em;
458
+ text-transform: uppercase;
459
+ color: var(--ck-color-primary);
460
+ }
461
+
462
+ .ck-cancel-flow .ck-pause-resume-date {
463
+ font-size: 14px;
464
+ font-weight: 600;
465
+ color: var(--ck-color-text);
466
+ font-variant-numeric: tabular-nums;
467
+ margin-top: 2px;
468
+ }
469
+
470
+ .ck-cancel-flow .ck-pause-resume-icon {
471
+ color: var(--ck-color-primary);
472
+ }
473
+
474
+ /* Trial extension: day count badge + new end date in accent-soft container. */
475
+ .ck-cancel-flow .ck-trial-block {
476
+ display: flex;
477
+ align-items: center;
478
+ gap: 16px;
479
+ padding: 20px;
480
+ background: var(--ck-color-primary-soft);
481
+ border-radius: var(--ck-radius-lg);
482
+ }
483
+
484
+ .ck-cancel-flow .ck-trial-badge {
485
+ flex-shrink: 0;
486
+ width: 80px;
487
+ height: 80px;
488
+ border-radius: var(--ck-radius-lg);
489
+ background: var(--ck-color-primary);
490
+ color: #ffffff;
491
+ display: flex;
492
+ flex-direction: column;
493
+ align-items: center;
494
+ justify-content: center;
495
+ }
496
+
497
+ .ck-cancel-flow .ck-trial-days {
498
+ font-size: 28px;
499
+ font-weight: 700;
500
+ line-height: 1;
501
+ font-variant-numeric: tabular-nums;
502
+ }
503
+
504
+ .ck-cancel-flow .ck-trial-unit {
505
+ font-size: 10px;
506
+ font-weight: 600;
507
+ letter-spacing: 0.08em;
508
+ text-transform: uppercase;
509
+ margin-top: 2px;
510
+ }
511
+
512
+ .ck-cancel-flow .ck-trial-end-label {
513
+ font-size: 11px;
514
+ font-weight: 600;
515
+ letter-spacing: 0.06em;
516
+ text-transform: uppercase;
517
+ color: var(--ck-color-text-muted);
518
+ }
519
+
520
+ .ck-cancel-flow .ck-trial-end-date {
521
+ font-size: 16px;
522
+ font-weight: 600;
523
+ color: var(--ck-color-text);
524
+ margin-top: 2px;
525
+ }
526
+
527
+ /* Redirect: featured link. */
528
+ .ck-cancel-flow .ck-redirect-link {
529
+ display: flex;
530
+ align-items: center;
531
+ justify-content: space-between;
532
+ padding: 12px 16px;
533
+ border: 1px solid var(--ck-color-border);
534
+ border-radius: var(--ck-radius-md);
535
+ background: var(--ck-color-surface);
536
+ color: var(--ck-color-text);
537
+ text-decoration: none;
538
+ font-size: 14px;
539
+ font-weight: 600;
540
+ transition: border-color var(--ck-motion-fast);
541
+ }
542
+
543
+ .ck-cancel-flow .ck-redirect-link:hover {
544
+ border-color: var(--ck-color-border-strong);
545
+ }
546
+
547
+ .ck-cancel-flow .ck-redirect-icon {
548
+ color: var(--ck-color-text-muted);
549
+ }
550
+
551
+ /* --- Plan change: side-by-side cards --- */
552
+ .ck-cancel-flow .ck-plan-grid {
553
+ display: grid;
554
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
555
+ gap: 12px;
556
+ margin-bottom: 20px;
557
+ }
558
+
559
+ .ck-cancel-flow .ck-plan-card {
560
+ appearance: none;
561
+ width: 100%;
562
+ padding: 20px;
563
+ border: 1.5px solid var(--ck-color-border);
564
+ border-radius: var(--ck-radius-lg);
565
+ background: var(--ck-color-surface);
566
+ color: inherit;
567
+ font-family: inherit;
568
+ cursor: pointer;
569
+ transition:
570
+ border-color var(--ck-motion-fast),
571
+ box-shadow var(--ck-motion-fast);
572
+ text-align: left;
573
+ }
574
+
575
+ .ck-cancel-flow .ck-plan-card:hover {
576
+ border-color: var(--ck-color-border-strong);
577
+ }
578
+
579
+ .ck-cancel-flow .ck-plan-card--selected {
580
+ border-color: var(--ck-color-primary);
581
+ box-shadow:
582
+ 0 4px 6px -1px rgba(12, 10, 9, 0.06),
583
+ 0 2px 4px -2px rgba(12, 10, 9, 0.06);
584
+ }
585
+
586
+ .ck-cancel-flow .ck-plan-name {
587
+ font-size: 16px;
588
+ font-weight: 600;
589
+ letter-spacing: -0.01em;
590
+ color: var(--ck-color-text);
591
+ margin-bottom: 4px;
592
+ }
593
+
594
+ .ck-cancel-flow .ck-plan-tagline {
595
+ font-size: 12px;
596
+ color: var(--ck-color-text-secondary);
597
+ min-height: 16px;
598
+ margin-bottom: 16px;
599
+ }
600
+
601
+ .ck-cancel-flow .ck-plan-price-row {
602
+ display: flex;
603
+ align-items: baseline;
604
+ gap: 6px;
605
+ margin-bottom: 20px;
606
+ }
607
+
608
+ .ck-cancel-flow .ck-plan-amount {
609
+ font-size: 26px;
610
+ font-weight: 700;
611
+ letter-spacing: -0.02em;
612
+ color: var(--ck-color-text);
613
+ font-variant-numeric: tabular-nums;
614
+ }
615
+
616
+ .ck-cancel-flow .ck-plan-period {
617
+ font-size: 13px;
618
+ color: var(--ck-color-text-muted);
619
+ }
620
+
621
+ .ck-cancel-flow .ck-plan-msrp {
622
+ font-size: 13px;
623
+ color: var(--ck-color-text-muted);
624
+ text-decoration: line-through;
625
+ margin-left: 4px;
626
+ }
627
+
628
+ .ck-cancel-flow .ck-plan-features {
629
+ list-style: none;
630
+ padding: 0;
631
+ margin: 0;
632
+ display: flex;
633
+ flex-direction: column;
634
+ gap: 8px;
635
+ }
636
+
637
+ .ck-cancel-flow .ck-plan-feature {
638
+ font-size: 13px;
639
+ color: var(--ck-color-text);
640
+ display: flex;
641
+ align-items: flex-start;
642
+ gap: 8px;
643
+ line-height: 1.4;
644
+ }
645
+
646
+ .ck-cancel-flow .ck-plan-feature-check {
647
+ color: var(--ck-color-text-muted);
648
+ margin-top: 3px;
649
+ flex-shrink: 0;
650
+ }
651
+
652
+ /* --- Feedback: bordered + counter --- */
653
+ .ck-cancel-flow .ck-feedback-field {
654
+ border: 1.5px solid var(--ck-color-border);
655
+ border-radius: var(--ck-radius-md);
656
+ padding: 12px;
657
+ background: var(--ck-color-surface);
658
+ margin-bottom: 20px;
659
+ transition: border-color var(--ck-motion-fast);
660
+ }
661
+
662
+ .ck-cancel-flow .ck-feedback-field--focused {
663
+ border-color: var(--ck-color-primary);
664
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ck-color-primary) 20%, transparent);
665
+ }
666
+
667
+ .ck-cancel-flow .ck-feedback-field--invalid {
668
+ border-color: var(--ck-color-danger);
669
+ }
670
+
671
+ .ck-cancel-flow .ck-textarea {
672
+ display: block;
673
+ width: 100%;
674
+ min-height: 64px;
675
+ padding: 0;
676
+ font-size: 14px;
677
+ font-family: inherit;
678
+ line-height: 1.55;
679
+ border: none;
680
+ outline: none;
681
+ background: transparent;
682
+ color: var(--ck-color-text);
683
+ resize: vertical;
684
+ }
685
+
686
+ /* The .ck-feedback-field wrapper handles the focus ring; suppress the */
687
+ /* global :focus-visible outline on the textarea so they don't stack. */
688
+ .ck-cancel-flow .ck-textarea:focus,
689
+ .ck-cancel-flow .ck-textarea:focus-visible {
690
+ outline: none;
691
+ }
692
+
693
+ .ck-cancel-flow .ck-textarea::placeholder {
694
+ color: var(--ck-color-text-muted);
695
+ }
696
+
697
+ .ck-cancel-flow .ck-character-count {
698
+ display: flex;
699
+ justify-content: flex-end;
700
+ font-size: 12px;
701
+ color: var(--ck-color-text-muted);
702
+ font-variant-numeric: tabular-nums;
703
+ margin-top: 6px;
704
+ }
705
+
706
+ .ck-cancel-flow .ck-character-count--invalid {
707
+ color: var(--ck-color-danger);
708
+ font-weight: 500;
709
+ }
710
+
711
+ /* --- Confirm step --- */
712
+ .ck-cancel-flow .ck-period-end {
713
+ font-size: 13px;
714
+ color: var(--ck-color-text-secondary);
715
+ line-height: 1.55;
716
+ margin-bottom: 20px;
717
+ }
718
+
719
+ .ck-cancel-flow .ck-period-end strong {
720
+ color: var(--ck-color-text);
721
+ font-weight: 600;
722
+ }
723
+
724
+ /* --- Success step --- */
725
+ /* No box-padding here — .ck-content already supplies the surrounding */
726
+ /* inset. The 8px top compensates for the missing title row above the */
727
+ /* icon so the icon sits at the same optical y-position as titles do */
728
+ /* on other steps. */
729
+ .ck-cancel-flow .ck-step-success {
730
+ text-align: center;
731
+ padding-top: 8px;
732
+ }
733
+
734
+ .ck-cancel-flow .ck-success-icon {
735
+ display: inline-flex;
736
+ align-items: center;
737
+ justify-content: center;
738
+ width: 56px;
739
+ height: 56px;
740
+ border-radius: 999px;
741
+ background: var(--ck-color-success-soft);
742
+ color: var(--ck-color-success);
743
+ margin-bottom: 20px;
744
+ }
745
+
746
+ .ck-cancel-flow .ck-step-success .ck-step-title {
747
+ font-size: 22px;
748
+ }
749
+
750
+ .ck-cancel-flow .ck-step-success .ck-step-description {
751
+ max-width: 320px;
752
+ /* Spacing below comes from .ck-success-actions margin-top — collapsing */
753
+ /* the shared 20px bottom margin avoids double-stacking. */
754
+ margin: 0 auto;
755
+ }
756
+
757
+ .ck-cancel-flow .ck-success-actions {
758
+ margin-top: 32px;
759
+ padding-inline: 16px;
760
+ }