PluginProbe
Charitable – Donation & Fundraising Platform (Donation Forms, Recurring Donations & Fundraising Campaigns) / 1.8.13
Charitable – Donation & Fundraising Platform (Donation Forms, Recurring Donations & Fundraising Campaigns) v1.8.13
1.8.13.1 1.8.13 1.8.12.3 1.8.12.2 1.8.12.1 1.8.12 1.8.11.3 1.8.11.2 1.8.11.1 1.8.11 1.6.6 1.6.60 1.6.7 1.6.8 1.6.9 1.7.0 1.7.0.1 1.7.0.11 1.7.0.12 1.7.0.14 1.7.0.2 1.7.0.3 1.7.0.5 1.7.0.6 1.7.0.7 All 212 releases
charitable / assets / css / admin / charitable-ai-mcp.css

charitable-ai-mcp.css in Charitable – Donation & Fundraising Platform (Donation Forms, Recurring Donations & Fundraising Campaigns) 1.8.13, at assets/css/admin/charitable-ai-mcp.css

1,037 lines 26.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * Charitable Tools > AI Assistants.
3 *
4 * Colour values are Charitable brand canon, not WPForms':
5 * #fc9a2a brand orange (primary button)
6 * #fc8c0c brand orange dark (button hover)
7 * #1e1515 brand ink (dark hero ground)
8 * #31714c brand green (card bullet marks)
9 *
10 * The hero uses brand INK rather than the WP-admin grey #2c3338 that WPForms
11 * uses, so the panel reads as Charitable rather than as a copy. Type is Inter
12 * via the admin stack on purpose - product UI matches WordPress admin.
13 *
14 * Ported verbatim from Charitable Pro (pinned commit 4f84275197) for the Lite
15 * 1.8.13 Tools > AI MCP screen. The two additions at the bottom of this file -
16 * .charitable-ai-card-note and .charitable-ai-card-upgrade, for the two
17 * Pro-gated capability cards Lite shows that Pro does not - reuse only the
18 * custom properties and literal values already declared above; nothing below
19 * introduces a new colour.
20 *
21 * @since 1.8.13
22 */
23
24 .charitable-ai-mcp {
25 --chai-orange: #fc9a2a;
26 --chai-orange-dark: #fc8c0c;
27 --chai-ink: #1e1515;
28 --chai-green: #31714c;
29 --chai-border: #dcdcde;
30 --chai-muted: #6b615c;
31 /* A darkened brand orange for small text on white, where #fc9a2a does not
32 carry enough contrast. NOT a canon brand value. Two uses remain - the
33 pre-flight notice icon and the troubleshooting summary - both of them text
34 or text-adjacent. The card icons moved to canon --chai-orange on
35 2026-09-16, because a decorative glyph is not held to text contrast. */
36 --chai-accent-ink: #8a4d00;
37 /* A warm off-white for a secondary row, one step off surface white. Neutral,
38 biased slightly toward the brand orange so it does not read as grey. */
39 --chai-surface-2: #f7f3ef;
40
41 max-width: 1100px;
42 margin: 0 0 20px;
43 font-size: 14px;
44 line-height: 1.6;
45 -webkit-font-smoothing: antialiased;
46 }
47
48 /* ---- pre-flight notice (WP < 6.9) ---- */
49
50 .charitable-ai-mcp .charitable-ai-notice {
51 display: flex;
52 align-items: flex-start;
53 gap: 10px;
54 background: #fdf4e7;
55 border: 1px solid #f0c98a;
56 border-left: 4px solid var(--chai-orange);
57 border-radius: 6px;
58 padding: 12px 16px;
59 margin: 0 0 16px;
60 }
61
62 .charitable-ai-mcp .charitable-ai-notice .dashicons {
63 color: var(--chai-accent-ink);
64 flex: none;
65 margin-top: 2px;
66 }
67
68 .charitable-ai-mcp .charitable-ai-notice p {
69 margin: 0;
70 color: #5d4a2e;
71 }
72
73 /* ---- dark hero ---- */
74
75 .charitable-ai-mcp .charitable-ai-hero {
76 display: flex;
77 gap: 32px;
78 align-items: flex-start;
79 justify-content: space-between;
80 background: var(--chai-ink);
81 /* Top corners only: the white cards panel sits flush beneath and carries the
82 bottom pair, so the two read as one continuous card rather than two blocks
83 with the dark one rounding away from the panel's square top edge. */
84 border-radius: 8px 8px 0 0;
85 padding: 28px 30px 30px;
86 color: #f5f1ec;
87 }
88
89 .charitable-ai-mcp .charitable-ai-hero-body {
90 flex: 1 1 auto;
91 min-width: 0;
92 max-width: 680px;
93 }
94
95 .charitable-ai-mcp .charitable-ai-eyebrow {
96 margin: 0 0 10px;
97 font-size: 11px;
98 font-weight: 700;
99 letter-spacing: 0.11em;
100 text-transform: uppercase;
101 color: #a89d96;
102 }
103
104 .charitable-ai-mcp .charitable-ai-title {
105 margin: 0 0 10px;
106 padding: 0;
107 font-size: 22px;
108 font-weight: 700;
109 line-height: 1.25;
110 color: #ffffff;
111 }
112
113 .charitable-ai-mcp .charitable-ai-desc {
114 margin: 0 0 20px;
115 color: #ddd5cd;
116 }
117
118 .charitable-ai-mcp .charitable-ai-desc a {
119 color: #fcbf72;
120 text-decoration: underline;
121 text-underline-offset: 2px;
122 }
123
124 .charitable-ai-mcp .charitable-ai-desc a:hover,
125 .charitable-ai-mcp .charitable-ai-desc a:focus {
126 color: var(--chai-orange);
127 }
128
129 .charitable-ai-mcp .charitable-ai-actions {
130 display: flex;
131 align-items: center;
132 gap: 16px;
133 flex-wrap: wrap;
134 }
135
136 .charitable-ai-mcp .charitable-ai-button {
137 display: inline-flex;
138 align-items: center;
139 gap: 8px;
140 background: var(--chai-orange);
141 color: var(--chai-ink);
142 font-size: 14px;
143 font-weight: 600;
144 line-height: 1;
145 padding: 12px 20px;
146 border-radius: 5px;
147 text-decoration: none;
148 transition: background-color 0.15s ease;
149 }
150
151 .charitable-ai-mcp .charitable-ai-button:hover,
152 .charitable-ai-mcp .charitable-ai-button:focus {
153 background: var(--chai-orange-dark);
154 color: var(--chai-ink);
155 }
156
157 .charitable-ai-mcp .charitable-ai-button:focus-visible {
158 outline: 2px solid #ffffff;
159 outline-offset: 2px;
160 }
161
162 .charitable-ai-mcp .charitable-ai-note {
163 margin: 14px 0 0;
164 font-size: 13px;
165 color: #a89d96;
166 }
167
168 /* ---- AI client chips ---- */
169
170 .charitable-ai-mcp .charitable-ai-clients {
171 flex: 0 0 auto;
172 display: flex;
173 flex-direction: column;
174 gap: 8px;
175 align-items: stretch;
176 min-width: 170px;
177 }
178
179 /* Light chips, not dark: the vendor SVGs render through <img> with their own
180 fills - one of which is black - so a dark chip would hide it. */
181 .charitable-ai-mcp .charitable-ai-client {
182 display: flex;
183 align-items: center;
184 gap: 9px;
185 background: #ffffff;
186 border: 1px solid var(--chai-border);
187 border-radius: 6px;
188 padding: 9px 13px;
189 font-size: 13px;
190 font-weight: 600;
191 color: var(--chai-ink);
192 }
193
194 .charitable-ai-mcp .charitable-ai-client-icon {
195 flex: none;
196 display: inline-flex;
197 align-items: center;
198 justify-content: center;
199 width: 16px;
200 height: 16px;
201 }
202
203 .charitable-ai-mcp .charitable-ai-client-icon img {
204 display: block;
205 width: 16px;
206 height: 16px;
207 }
208
209 .charitable-ai-mcp .charitable-ai-client-label {
210 white-space: nowrap;
211 }
212
213 .charitable-ai-mcp .charitable-ai-client-any {
214 display: block;
215 text-align: right;
216 padding: 2px 4px 0;
217 font-size: 12px;
218 color: #a89d96;
219 }
220
221 /* ---- white cards panel ---- */
222
223 .charitable-ai-mcp .charitable-ai-panel {
224 background: #ffffff;
225 border: 1px solid var(--chai-border);
226 border-top: 0;
227 border-radius: 0 0 8px 8px;
228 padding: 22px 24px 24px;
229 }
230
231 /* Per David 2026-09-16: the two links moved off the title's line and onto a
232 row of their own beneath it, so this is a column rather than a
233 space-between row. */
234 .charitable-ai-mcp .charitable-ai-panel-head {
235 display: flex;
236 flex-direction: column;
237 align-items: flex-start;
238 gap: 6px;
239 margin: 0 0 18px;
240 }
241
242 .charitable-ai-mcp .charitable-ai-panel-links {
243 display: flex;
244 align-items: center;
245 flex-wrap: wrap;
246 gap: 10px;
247 margin: 0;
248 padding: 0;
249 font-size: 13px;
250 line-height: 1.4;
251 }
252
253 .charitable-ai-mcp .charitable-ai-panel-links-sep {
254 color: var(--chai-border);
255 }
256
257 /* Left as a standard WP admin link colour on purpose: blue is the affordance
258 that says "this navigates", and both links here do. */
259 .charitable-ai-mcp .charitable-ai-video-link {
260 display: inline-flex;
261 align-items: center;
262 gap: 5px;
263 font-size: 13px;
264 font-weight: 500;
265 text-decoration: none;
266 white-space: nowrap;
267 }
268
269 .charitable-ai-mcp .charitable-ai-video-link .dashicons {
270 width: 17px;
271 height: 17px;
272 font-size: 17px;
273 line-height: 1;
274 }
275
276 .charitable-ai-mcp .charitable-ai-panel-title {
277 margin: 0;
278 padding: 0;
279 font-size: 16px;
280 font-weight: 700;
281 color: var(--chai-ink);
282 }
283
284 /* Per David 2026-09-16: the brand word only, picked out of an otherwise ink
285 heading. Canon orange is safe on a 16px BOLD word - the contrast caveat on
286 --chai-accent-ink is about small text. */
287 .charitable-ai-mcp .charitable-ai-panel-title .charitable-ai-brand {
288 color: var(--chai-orange);
289 }
290
291 .charitable-ai-mcp .charitable-ai-docs-link {
292 display: inline-flex;
293 align-items: center;
294 gap: 6px;
295 font-size: 13px;
296 font-weight: 500;
297 text-decoration: none;
298 white-space: nowrap;
299 }
300
301 .charitable-ai-mcp .charitable-ai-docs-link:hover .charitable-ai-docs-arrow {
302 transform: translateX(2px);
303 }
304
305 .charitable-ai-mcp .charitable-ai-docs-arrow {
306 transition: transform 0.15s ease;
307 }
308
309 .charitable-ai-mcp .charitable-ai-cards {
310 display: grid;
311 grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
312 gap: 16px;
313 }
314
315 .charitable-ai-mcp .charitable-ai-card {
316 border: 1px solid var(--chai-border);
317 border-radius: 7px;
318 padding: 18px 18px 8px;
319 background: #ffffff;
320 }
321
322 .charitable-ai-mcp .charitable-ai-card-head {
323 display: flex;
324 align-items: center;
325 gap: 10px;
326 margin: 0 0 12px;
327 }
328
329 /* Per David 2026-09-16: no chip behind the glyph, and brand orange rather than
330 the darkened --chai-accent-ink. These dashicons are decorative (aria-hidden,
331 with the card title carrying the meaning), so canon #fc9a2a is right here even
332 though this file deliberately avoids it for small TEXT on white. Without the
333 chip the 34px box left the glyph floating away from its label, hence the
334 tighter box and larger glyph. */
335 .charitable-ai-mcp .charitable-ai-card-icon {
336 flex: none;
337 width: 24px;
338 height: 24px;
339 display: inline-flex;
340 align-items: center;
341 justify-content: center;
342 color: var(--chai-orange);
343 font-size: 22px;
344 }
345
346 .charitable-ai-mcp .charitable-ai-card-title {
347 margin: 0;
348 padding: 0;
349 font-size: 14px;
350 font-weight: 700;
351 color: var(--chai-ink);
352 }
353
354 .charitable-ai-mcp .charitable-ai-card-list {
355 margin: 0;
356 padding: 0;
357 list-style: none;
358 }
359
360 .charitable-ai-mcp .charitable-ai-card-list li {
361 position: relative;
362 margin: 0;
363 padding: 9px 0 9px 16px;
364 border-top: 1px solid #f0eeec;
365 font-size: 13px;
366 color: #3c3c3c;
367 }
368
369 .charitable-ai-mcp .charitable-ai-card-list li:first-child {
370 border-top: 0;
371 }
372
373 .charitable-ai-mcp .charitable-ai-card-list li::before {
374 content: "";
375 position: absolute;
376 left: 0;
377 top: 16px;
378 width: 6px;
379 height: 6px;
380 border-radius: 50%;
381 background: var(--chai-green);
382 }
383
384 /* ---- panel footer ---- */
385
386 .charitable-ai-mcp .charitable-ai-panel-foot {
387 margin: 18px 0 0;
388 padding: 16px 0 0;
389 border-top: 1px solid var(--chai-border);
390 }
391
392 .charitable-ai-mcp .charitable-ai-panel-foot p {
393 margin: 0;
394 font-size: 13px;
395 color: var(--chai-muted);
396 /* Full width: the panel is wider than a reading measure and the constrained
397 version wrapped after two-thirds of the row, which read as a layout fault
398 rather than as a deliberate measure. */
399 max-width: none;
400 }
401
402 /* ---- narrow screens ---- */
403
404 @media screen and (max-width: 782px) {
405
406 .charitable-ai-mcp .charitable-ai-hero {
407 flex-direction: column;
408 gap: 22px;
409 padding: 22px 20px 24px;
410 }
411
412 .charitable-ai-mcp .charitable-ai-clients {
413 flex-direction: row;
414 flex-wrap: wrap;
415 min-width: 0;
416 width: 100%;
417 }
418
419 .charitable-ai-mcp .charitable-ai-client {
420 flex: 1 1 auto;
421 text-align: center;
422 }
423
424 .charitable-ai-mcp .charitable-ai-client-any {
425 flex: 1 1 100%;
426 text-align: left;
427 }
428
429 .charitable-ai-mcp .charitable-ai-panel {
430 padding: 18px 16px 20px;
431 }
432 }
433
434 @media (prefers-reduced-motion: reduce) {
435
436 .charitable-ai-mcp * {
437 transition: none !important;
438 }
439 }
440
441 /* ---- the write-access toggles, on the dark hero ---- */
442
443
444 .charitable-ai-mcp .charitable-ai-gate {
445 display: flex;
446 align-items: center;
447 gap: 10px;
448 }
449
450 .charitable-ai-mcp .charitable-ai-gate-label {
451 font-size: 12px;
452 font-weight: 600;
453 letter-spacing: 0.06em;
454 text-transform: uppercase;
455 color: #ddd5cd;
456 cursor: pointer;
457 }
458
459 /* Self-contained slider. The shared .charitable-toggle component lives in
460 charitable-admin-legacy.css and charitable-logger.css, neither of which is
461 enqueued on this screen, so the control rendered as a bare checkbox. Styling it
462 here beats enqueuing a legacy stylesheet and inheriting its whole cascade. */
463 .charitable-ai-mcp .charitable-toggle {
464 position: relative;
465 display: inline-block;
466 width: 38px;
467 height: 21px;
468 flex: none;
469 cursor: pointer;
470 }
471
472 .charitable-ai-mcp .charitable-toggle input {
473 position: absolute;
474 opacity: 0;
475 width: 100%;
476 height: 100%;
477 margin: 0;
478 cursor: pointer;
479 }
480
481 .charitable-ai-mcp .charitable-toggle .charitable-toggle-slider {
482 position: absolute;
483 inset: 0;
484 background: #4a403a;
485 border-radius: 21px;
486 transition: background-color 0.15s ease;
487 pointer-events: none;
488 }
489
490 .charitable-ai-mcp .charitable-toggle .charitable-toggle-slider::before {
491 content: "";
492 position: absolute;
493 top: 3px;
494 left: 3px;
495 width: 15px;
496 height: 15px;
497 background: #ffffff;
498 border-radius: 50%;
499 transition: transform 0.15s ease;
500 }
501
502 .charitable-ai-mcp .charitable-toggle input:checked + .charitable-toggle-slider {
503 background: var(--chai-green);
504 }
505
506 .charitable-ai-mcp .charitable-toggle input:checked + .charitable-toggle-slider::before {
507 transform: translateX(17px);
508 }
509
510 .charitable-ai-mcp .charitable-toggle input:focus-visible + .charitable-toggle-slider {
511 outline: 2px solid var(--chai-orange);
512 outline-offset: 2px;
513 }
514
515 .charitable-ai-mcp .charitable-toggle input:disabled + .charitable-toggle-slider {
516 opacity: 0.6;
517 }
518
519 /* Our own ring rather than WordPress's .spinner, which is a grey background-image
520 sprite drawn for light admin surfaces and reads as a grey blob on the ink hero.
521 Occupies its space at all times so flipping the toggle does not shift the row. */
522 .charitable-ai-mcp .charitable-ai-gate-spinner {
523 width: 14px;
524 height: 14px;
525 flex: none;
526 border-radius: 50%;
527 border: 2px solid rgba( 255, 255, 255, 0.25 );
528 border-top-color: var(--chai-orange);
529 /* visibility, not opacity with a transition. A 0.12s fade on a control that
530 is on screen for about 100ms buys nothing, and it makes the element's state
531 ambiguous to read while the transition is mid-flight. */
532 visibility: hidden;
533 }
534
535 .charitable-ai-mcp .charitable-ai-gate-spinner.is-active {
536 visibility: visible;
537 animation: charitable-ai-spin 0.6s linear infinite;
538 }
539
540 @keyframes charitable-ai-spin {
541
542 to {
543 transform: rotate( 360deg );
544 }
545 }
546
547 /* Reduced motion: still show that something is happening, without spinning. */
548 @media ( prefers-reduced-motion: reduce ) {
549
550 .charitable-ai-mcp .charitable-ai-gate-spinner.is-active {
551 animation: none;
552 border-top-color: rgba( 255, 255, 255, 0.25 );
553 border-right-color: var(--chai-orange);
554 }
555 }
556
557 /* ---- read-only banner ---- */
558
559 /* No box. The state it reports is normal and expected - writes start off - so a
560 bordered, tinted panel over-weighted it and read as a warning about a problem.
561 The icon carries the meaning; the spacing does the separating. The panel's own
562 22px top padding sits above this margin, so ~30px above and 26px below. */
563 .charitable-ai-mcp .charitable-ai-readonly-banner {
564 display: flex;
565 align-items: flex-start;
566 gap: 8px;
567 margin: 14px 0 30px;
568 padding: 0;
569 font-size: 13px;
570 color: #3c3c3c;
571 max-width: none;
572 }
573
574 .charitable-ai-mcp .charitable-ai-readonly-banner .dashicons {
575 flex: none;
576 color: var(--chai-green);
577 font-size: 17px;
578 width: 17px;
579 height: 17px;
580 margin-top: 1px;
581 }
582
583 /* ---- inline diagnostics ---- */
584
585 .charitable-ai-mcp .charitable-ai-diag-wrap {
586 margin: 14px 0 0;
587 }
588
589 /* Native <details> rather than a JS toggle: it is keyboard accessible and
590 focusable for free, and the summary IS the affordance - so the duplicate link
591 that used to sit in the row above has gone. */
592 .charitable-ai-mcp .charitable-ai-diag-summary {
593 display: inline-flex;
594 align-items: center;
595 gap: 5px;
596 cursor: pointer;
597 font-size: 13px;
598 font-weight: 500;
599 color: var(--chai-accent-ink);
600 list-style: none;
601 width: auto;
602 }
603
604 .charitable-ai-mcp .charitable-ai-diag-summary::-webkit-details-marker {
605 display: none;
606 }
607
608 .charitable-ai-mcp .charitable-ai-diag-summary::before {
609 content: "";
610 width: 0;
611 height: 0;
612 border-left: 5px solid currentColor;
613 border-top: 4px solid transparent;
614 border-bottom: 4px solid transparent;
615 transition: transform 0.15s ease;
616 }
617
618 .charitable-ai-mcp .charitable-ai-diag-wrap[open] .charitable-ai-diag-summary::before {
619 transform: rotate(90deg);
620 }
621
622 .charitable-ai-mcp .charitable-ai-diag-summary:hover,
623 .charitable-ai-mcp .charitable-ai-diag-summary:focus-visible {
624 text-decoration: underline;
625 }
626
627 .charitable-ai-mcp .charitable-ai-diag-wrap[open] .charitable-ai-diag-summary {
628 margin-bottom: 10px;
629 }
630
631 .charitable-ai-mcp .charitable-ai-diag-title {
632 margin: 18px 0 8px;
633 padding: 0;
634 font-size: 13px;
635 font-weight: 700;
636 color: var(--chai-ink);
637 }
638
639 .charitable-ai-mcp .charitable-ai-diag-box {
640 border: 1px solid var(--chai-border);
641 border-radius: 7px;
642 overflow: hidden;
643 }
644
645 .charitable-ai-mcp .charitable-ai-diag {
646 margin: 0;
647 padding: 0;
648 list-style: none;
649 max-width: none;
650 }
651
652 .charitable-ai-mcp .charitable-ai-diag-row {
653 display: grid;
654 /* Fixed, not minmax(): each <li> is its own grid container, so an auto column
655 is sized per row and the values end up on ragged left edges. */
656 grid-template-columns: 20px 230px 1fr;
657 align-items: baseline;
658 gap: 4px 10px;
659 margin: 0;
660 padding: 9px 14px;
661 border-top: 1px solid #f0eeec;
662 font-size: 13px;
663 }
664
665 .charitable-ai-mcp .charitable-ai-diag-row:first-child {
666 border-top: 0;
667 }
668
669 .charitable-ai-mcp .charitable-ai-diag-mark {
670 font-size: 16px;
671 width: 16px;
672 height: 16px;
673 align-self: center;
674 }
675
676 .charitable-ai-mcp .charitable-ai-diag-row.is-ok .charitable-ai-diag-mark {
677 color: var(--chai-green);
678 }
679
680 .charitable-ai-mcp .charitable-ai-diag-row.is-problem .charitable-ai-diag-mark {
681 color: #b32d2e;
682 }
683
684 .charitable-ai-mcp .charitable-ai-diag-label {
685 font-weight: 600;
686 color: var(--chai-ink);
687 }
688
689 .charitable-ai-mcp .charitable-ai-diag-value {
690 color: var(--chai-muted);
691 }
692
693 .charitable-ai-mcp .charitable-ai-diag-row.is-problem .charitable-ai-diag-value {
694 color: #b32d2e;
695 }
696
697 @media screen and (max-width: 782px) {
698
699 .charitable-ai-mcp .charitable-ai-diag-row {
700 grid-template-columns: 20px 1fr;
701 }
702
703 .charitable-ai-mcp .charitable-ai-diag-value {
704 grid-column: 2;
705 }
706 }
707
708 /* A closing row inside the box, not a check - so it gets the same padding as a
709 row and a separator above it, but no status mark and no grid. */
710 .charitable-ai-mcp .charitable-ai-diag-more {
711 margin: 0;
712 padding: 9px 14px;
713 border-top: 1px solid var(--chai-border);
714 background: var(--chai-surface-2);
715 font-size: 13px;
716 color: var(--chai-muted);
717 max-width: none;
718 }
719
720 /* While an install is in flight the button must not take a second click - that
721 would install twice - and it should read as busy rather than as a live
722 control. The JS adds this class for the duration of the request. */
723 .charitable-ai-mcp .charitable-ai-button.is-working {
724 opacity: 0.7;
725 pointer-events: none;
726 }
727
728 /* ---- "Watch video" modal ----
729 *
730 * NOT scoped under .charitable-ai-mcp: jquery-confirm appends its markup to
731 * <body>, outside this page's wrapper, so a scoped selector would never match.
732 * The class comes from `theme: 'modern,charitable-ai-video-modal'` in
733 * charitable-ai-mcp.js - jquery-confirm splits that on the comma and prefixes
734 * each part with `jconfirm-` (themePrefix in the library).
735 *
736 * The frame is a padding-top aspect box rather than fixed pixels, because the
737 * Lite welcome modal's 1280x720 iframe at boxWidth 1300 overflows any laptop
738 * viewport narrower than that.
739 */
740
741 .jconfirm.jconfirm-charitable-ai-video-modal .jconfirm-content {
742 padding: 0;
743 }
744
745 .jconfirm.jconfirm-charitable-ai-video-modal .charitable-ai-video-frame {
746 position: relative;
747 width: 100%;
748 padding-top: 56.25%;
749 background: #000000;
750 overflow: hidden;
751 border-radius: 4px;
752 }
753
754 .jconfirm.jconfirm-charitable-ai-video-modal .charitable-ai-video-frame iframe {
755 position: absolute;
756 top: 0;
757 left: 0;
758 width: 100%;
759 height: 100%;
760 border: 0;
761 display: block;
762 }
763
764 /* ---- Lite-only: Pro-gated capability cards ----
765 *
766 * Two of get_cards()'s entries describe an area Lite does not register
767 * (donor management, donation-form editing) rather than listing bullets for
768 * it. The .charitable-pro-badge next to the card title is the SAME sitewide
769 * component already shipped in charitable-admin.css (enqueued on every
770 * wp-admin screen), so it is reused rather than restyled here.
771 *
772 * The border colour below (#f0eeec) is not new: it is the exact value
773 * .charitable-ai-card-list li already uses above for the same divider role.
774 *
775 * @since 1.8.13
776 */
777
778 .charitable-ai-mcp .charitable-ai-card-note {
779 margin: 0 0 10px;
780 padding: 9px 0 0;
781 border-top: 1px solid #f0eeec;
782 font-size: 13px;
783 color: var(--chai-muted);
784 }
785
786 .charitable-ai-mcp .charitable-ai-card-upgrade {
787 margin: 0;
788 padding: 0 0 9px;
789 font-size: 13px;
790 }
791
792 .charitable-ai-mcp .charitable-ai-card-upgrade a {
793 color: var(--chai-accent-ink);
794 font-weight: 600;
795 text-decoration: none;
796 }
797
798 .charitable-ai-mcp .charitable-ai-card-upgrade a:hover,
799 .charitable-ai-mcp .charitable-ai-card-upgrade a:focus {
800 text-decoration: underline;
801 }
802
803 /* ---- AI Activity panel ----
804 *
805 * Added Lite 1.8.13, Task 12. Every colour below is one of this file's own
806 * existing custom properties, or a literal already used elsewhere in this
807 * exact file for the same semantic role - nothing new is introduced:
808 *
809 * applied -> var(--chai-green) (already the ".is-ok" diagnostics colour)
810 * refused -> var(--chai-accent-ink) (already used for accent text on white)
811 * denied -> #b32d2e (already the ".is-problem" diagnostics colour)
812 *
813 * Canon has no separate warning/danger token to draw on instead - confirmed
814 * against the brand token file, which notes the gap explicitly rather than
815 * leaving it silently unaddressed - so refused/denied deliberately reuse
816 * values this file already carries rather than inventing new ones.
817 *
818 * @since 1.8.13
819 */
820
821 .charitable-ai-mcp .charitable-ai-activity {
822 margin: 20px 0 0;
823 padding: 18px 0 0;
824 border-top: 1px solid var(--chai-border);
825 }
826
827 .charitable-ai-mcp .charitable-ai-activity-head {
828 display: flex;
829 align-items: baseline;
830 flex-wrap: wrap;
831 justify-content: space-between;
832 gap: 8px;
833 margin: 0 0 6px;
834 }
835
836 .charitable-ai-mcp .charitable-ai-activity-title {
837 margin: 0;
838 padding: 0;
839 font-size: 15px;
840 font-weight: 700;
841 color: var(--chai-ink);
842 }
843
844 .charitable-ai-mcp .charitable-ai-activity-client {
845 margin: 0;
846 font-size: 12px;
847 color: var(--chai-muted);
848 }
849
850 .charitable-ai-mcp .charitable-ai-activity-note {
851 margin: 0 0 6px;
852 font-size: 13px;
853 color: var(--chai-muted);
854 max-width: none;
855 }
856
857 /* ---- empty state: the common case, and the one most likely to be
858 screenshotted, so it reads as calm rather than as an error or a bare
859 table. No border, no icon - just a quiet, centred note. ---- */
860 .charitable-ai-mcp .charitable-ai-activity-empty {
861 padding: 26px 12px;
862 text-align: center;
863 background: var(--chai-surface-2);
864 border-radius: 7px;
865 margin: 10px 0 0;
866 }
867
868 .charitable-ai-mcp .charitable-ai-activity-empty-title {
869 margin: 0 0 4px;
870 font-size: 13px;
871 font-weight: 600;
872 color: var(--chai-ink);
873 }
874
875 .charitable-ai-mcp .charitable-ai-activity-empty-sub {
876 margin: 0;
877 font-size: 12px;
878 color: var(--chai-muted);
879 }
880
881 .charitable-ai-mcp .charitable-ai-activity-table-wrap {
882 margin: 10px 0 0;
883 overflow-x: auto;
884 border: 1px solid var(--chai-border);
885 border-radius: 7px;
886 }
887
888 .charitable-ai-mcp .charitable-ai-activity-table {
889 width: 100%;
890 border-collapse: collapse;
891 font-size: 13px;
892 }
893
894 .charitable-ai-mcp .charitable-ai-activity-table th,
895 .charitable-ai-mcp .charitable-ai-activity-table td {
896 padding: 9px 12px;
897 text-align: left;
898 vertical-align: top;
899 white-space: nowrap;
900 }
901
902 /* Details is the one column allowed to wrap - it carries the free-text
903 message plus the affected object, which is often the longest cell. */
904 .charitable-ai-mcp .charitable-ai-activity-table .charitable-ai-activity-col-message {
905 white-space: normal;
906 color: var(--chai-muted);
907 }
908
909 .charitable-ai-mcp .charitable-ai-activity-table thead th {
910 background: var(--chai-surface-2);
911 font-weight: 600;
912 color: var(--chai-ink);
913 border-bottom: 1px solid var(--chai-border);
914 }
915
916 .charitable-ai-mcp .charitable-ai-activity-table tbody tr {
917 border-top: 1px solid #f0eeec;
918 }
919
920 .charitable-ai-mcp .charitable-ai-activity-table tbody tr:first-child {
921 border-top: 0;
922 }
923
924 /* Same pill shape as the sitewide .charitable-pro-badge (padding, uppercase,
925 border-radius) so the two badge idioms this screen uses read as one
926 family, without reusing that class itself - a "Pro" label and an outcome
927 are not the same kind of thing. */
928 .charitable-ai-mcp .charitable-ai-outcome {
929 display: inline-block;
930 padding: 3px 8px;
931 font-size: 11px;
932 font-weight: 700;
933 line-height: 1.4;
934 letter-spacing: 0.02em;
935 text-transform: uppercase;
936 border-radius: 3px;
937 color: #ffffff;
938 white-space: nowrap;
939 }
940
941 .charitable-ai-mcp .charitable-ai-outcome-applied {
942 background: var(--chai-green);
943 }
944
945 /* Refused: the site's OWN write gate said no. Distinct from "denied" on
946 purpose - see the docblock above this section. */
947 .charitable-ai-mcp .charitable-ai-outcome-refused {
948 background: var(--chai-accent-ink);
949 }
950
951 /* Denied: a WordPress capability check said no. */
952 .charitable-ai-mcp .charitable-ai-outcome-denied {
953 background: #b32d2e;
954 }
955
956 .charitable-ai-mcp .charitable-ai-activity-more {
957 margin: 12px 0 0;
958 font-size: 13px;
959 }
960
961 .charitable-ai-mcp .charitable-ai-activity-more a {
962 display: inline-flex;
963 align-items: center;
964 gap: 5px;
965 text-decoration: none;
966 }
967
968 .charitable-ai-mcp .charitable-ai-activity-more a:hover,
969 .charitable-ai-mcp .charitable-ai-activity-more a:focus {
970 text-decoration: underline;
971 }
972
973 @media screen and (max-width: 782px) {
974
975 .charitable-ai-mcp .charitable-ai-activity-table th,
976 .charitable-ai-mcp .charitable-ai-activity-table td {
977 white-space: normal;
978 }
979 }
980
981 /*
982 * Collapsible AI Activity.
983 *
984 * The panel is collapsed on page load - the `is-collapsed` class ships in the
985 * markup (views/ai-mcp-activity.php) rather than being added by JS, so the
986 * table is never painted and then hidden.
987 *
988 * "View full history at Tools > Logs" sits outside .charitable-ai-activity-content
989 * and so stays visible in the collapsed state, which is the whole point: the
990 * default state must still offer a way through to the log.
991 *
992 * Every colour here already appears earlier in this stylesheet.
993 */
994 .charitable-ai-mcp .charitable-ai-activity-toggle {
995 align-self: center;
996 margin-left: auto;
997 display: inline-flex;
998 align-items: center;
999 background: none;
1000 border: 0;
1001 border-radius: 3px;
1002 padding: 4px;
1003 line-height: 1;
1004 color: #3c3c3c;
1005 cursor: pointer;
1006 }
1007
1008 .charitable-ai-mcp .charitable-ai-activity-toggle:hover,
1009 .charitable-ai-mcp .charitable-ai-activity-toggle:focus {
1010 color: #1e1515;
1011 }
1012
1013 .charitable-ai-mcp .charitable-ai-activity-toggle:focus-visible {
1014 outline: 2px solid #fc9a2a;
1015 outline-offset: 1px;
1016 }
1017
1018 /*
1019 * The chevron direction is a CLASS SWAP, not a rotate().
1020 *
1021 * charitable-ai-mcp.js swaps dashicons-arrow-right-alt2 (collapsed) for
1022 * dashicons-arrow-down-alt2 (expanded). A transform was tried first and
1023 * abandoned: the rule matched, won on specificity and was present in the
1024 * loaded stylesheet, but the computed transform stayed at identity in Chrome
1025 * whenever the transition was live - it only resolved to rotate(90deg) with
1026 * `transition` disabled. Swapping the icon has no such edge case, needs no
1027 * transition, and is what the glyphs are for.
1028 */
1029 .charitable-ai-mcp .charitable-ai-activity-angle {
1030 line-height: 1;
1031 }
1032
1033 /* The collapse itself. */
1034 .charitable-ai-mcp .charitable-ai-activity-collapsible.is-collapsed .charitable-ai-activity-content {
1035 display: none;
1036 }
1037