/**
 * Reports v3 preview.
 *
 * TEMPORARY, and a sibling of charitable-admin-dashboard-v3.css. Loaded only while the
 * dashboard v3 preview flag is on, so the shipping Reports page is untouched and reverting
 * is deleting a file.
 *
 * The reason it is a separate stylesheet rather than edits to charitable-admin.css: that file
 * styles the whole admin, has a hand-maintained .min.css sibling, and carries rules its SCSS
 * source does not - so recompiling drops them and editing means maintaining two copies. Same
 * reasoning as the dashboard's v3 file.
 *
 * Every rule hangs off body.charitable-dash-v3, which the preview gate adds, so nothing here
 * can apply with the flag off.
 *
 * @package Charitable_Pro/Assets/Admin
 * @since   1.8.19
 */

/* ──────────────────────────────────────────────────────────────────────────
   1. Toolbar
   Filtering on one side, actions on the other. The shipping markup put the campaign and
   category selects on the left and the date range plus Filter on the right next to Print,
   which mixed "narrow the data" with "take the data away" - so the date range and Filter
   move left to join the rest of the filtering, and the right side holds only actions.

   float: none on both halves because the shipping rules use .alignleft / .alignright, and
   two floats cannot be vertically aligned to each other.
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .charitable-reports-v3-toolbar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 10px;
	margin: 0 0 16px;
	padding: 0;
	border: 0;
}

body.charitable-dash-v3 .charitable-reports-v3-toolbar::after {
	content: none;
}

body.charitable-dash-v3 .charitable-reports-v3-toolbar .alignleft.actions,
body.charitable-dash-v3 .charitable-reports-v3-toolbar .alignright {
	float: none;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 7px;
	margin: 0;
	padding: 0;
}

body.charitable-dash-v3 .charitable-reports-v3-toolbar .alignright {
	margin-left: auto;
}

/* The datepicker sat in a floated block of its own; inside a flex row it needs no width. */
body.charitable-dash-v3 .charitable-reports-v3-toolbar .charitable-datepicker-container {
	display: flex;
	align-items: center;
	margin: 0;
}

/*
Print's own treatment, which the shipping button already has: white ground, hairline border,
label then glyph. Named here so the actions that join it later - Export CSV, Compare - inherit
one rule instead of each growing a look of its own.
*/
body.charitable-dash-v3 .charitable-reports-v3-toolbar .charitable-report-print-button,
body.charitable-dash-v3 .charitable-reports-v3-action {
	display: inline-flex;
	align-items: center;
	gap: 7px;
}

/*
The breakdown card's own Download CSV button sits OUTSIDE the toolbar, so the rule above never
reached it: it stayed inline-block with a 12px glyph while its three siblings were flex with 15px
ones. Same look, same button, different corner of the page - so it gets the same treatment.
*/
body.charitable-dash-v3 .charitable-report-download-button {
	display: inline-flex;
	align-items: center;
	gap: 7px;
}

/* ──────────────────────────────────────────────────────────────────────────
   2. Card footers
   The dashboard's "View All Addons" footer, brought to the report cards that lead somewhere.

   Values that carry the identity are the dashboard's exactly - border-top rgba(24,36,69,.1),
   link rgb(43,102,209) at weight 500, 8px to the chevron, underline on hover only. Height and
   padding are scaled to these cards: the dashboard's 70px and 0 30px belong to a full-width
   section and would be taller here than some cards' content.
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .charitable-reports-v3-cardfoot {
	display: flex;
	align-items: center;
	height: 46px;
	padding: 0 20px;
	margin: 0;
	background: #fff;
	border-top: 1px solid rgba( 24, 36, 69, 0.1 );
}

body.charitable-dash-v3 .charitable-reports-v3-cardfoot a {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-weight: 500;
	font-size: 13px;
	line-height: 16px;
	color: rgb( 43, 102, 209 );
	text-decoration: none;
	box-shadow: none;
}

body.charitable-dash-v3 .charitable-reports-v3-cardfoot a:hover,
body.charitable-dash-v3 .charitable-reports-v3-cardfoot a:focus {
	text-decoration: underline;
}

body.charitable-dash-v3 .charitable-reports-v3-cardfoot a svg {
	flex: none;
}

/*
The footer has to sit flush at the card's bottom edge, so the card's own bottom padding comes
off and moves onto the content above it. Without this the footer floats inside the padding with
a strip of white below its border, which reads as a mistake rather than as an edge.
*/
body.charitable-dash-v3 .charitable-report-card:has( > .charitable-reports-v3-cardfoot ) {
	padding-bottom: 0;
}

body.charitable-dash-v3 .charitable-report-card:has( > .charitable-reports-v3-cardfoot ) .charitable-toggle-container {
	padding-bottom: 6px;
}

/* ──────────────────────────────────────────────────────────────────────────
   3. Donations Breakdown collapse toggle
   Every other card on this page already had one. This section uses a .tablenav header rather
   than a card header, so it never got the treatment - the toggle is the same element and the
   same behaviour, positioned against that header instead.
   ────────────────────────────────────────────────────────────────────────── */

/*
These are the REFERENCE chevron's own values, copied rather than invented:
"body.charitable_page_charitable-reports .charitable-report-card .header a" in
charitable-admin.css gives every other chevron display:block, font-size:23px,
line-height:23px. NO colour is set here on purpose: these are <a href="#"> and the
admin's own link colour (#3858e9, and its :visited) has to reach them, or this
one chevron would sit at a fixed colour while the others changed state. An
earlier version pinned rgb(73,78,90) here, which was the VISITED colour of a
toggle I had clicked while testing - a hardcoded value read off a transient
state. This card is a
.tablenav.charitable-section, NOT a .charitable-report-card, so that rule never
reached it - and the 24x24 inline-flex box at rgba(25,29,45,.6) that used to sit
here filled the gap with different numbers, which is exactly why this one
chevron rendered smaller and greyer than the other ten. Matching the reference
is the whole fix; measured identical afterwards.
*/
body.charitable-dash-v3 .charitable-section .charitable-reports-v3-breakdown-toggle {
	display: block;
	font-size: 23px;
	line-height: 23px;
	margin-left: 8px;
	text-decoration: none;
	box-shadow: none;
}

body.charitable-dash-v3 .charitable-section .charitable-reports-v3-breakdown-toggle .charitable-angle-down {
	transition: transform 0.3s ease;
}

/*
The heading and its toggle on one line. .alignleft.actions is a floated block and the <h2>
inside it is block too, so an inline-flex anchor after the heading wrapped to the next line -
it rendered as a stray chevron floating under "Donations Breakdown". Making that one wrapper
a flex row puts them on the same baseline; scoped to this section so the identical wrapper in
the page toolbar above is untouched.
*/
body.charitable-dash-v3 .tablenav.charitable-section > .alignleft.actions {
	display: flex;
	align-items: center;
}

body.charitable-dash-v3 .tablenav.charitable-section > .alignleft.actions h2 {
	margin: 0;
}

/*
Donations Breakdown now wears .charitable-container, which on this screen is white and rounded
but carries no padding - so the heading and table would sit flush against the card edge. This
gives it the same inset the other report cards have.
*/
body.charitable-dash-v3 .tablenav.charitable-section.charitable-container {
	padding: 16px 20px;
	height: auto;
	margin-bottom: 16px;
}

body.charitable-dash-v3 .tablenav.charitable-section.charitable-container .charitable-toggle-container {
	margin-top: 4px;
}

/* ──────────────────────────────────────────────────────────────────────────
   4. Two columns
   Same proportion as the dashboard: a flexible main column and a fixed 330px rail. align-items
   start so each column's cards stack from the top independently - that independence is the whole
   reason these are two containers rather than one grid.
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .charitable-reports-v3-cols {
	display: grid;
	grid-template-columns: minmax( 0, 1fr ) 330px;
	gap: 16px;
	align-items: start;
}

body.charitable-dash-v3 .charitable-reports-v3-main,
body.charitable-dash-v3 .charitable-reports-v3-rail {
	display: flex;
	flex-direction: column;
	gap: 16px;
	min-width: 0;
}

/*
The cards inside each column carried their own bottom margins from the shipping layout, where
they sat in grids that needed them. The columns use gap now, so those margins would double the
spacing - and the last card in a column would push a gap past the column's own end.
*/
body.charitable-dash-v3 .charitable-reports-v3-main > *,
body.charitable-dash-v3 .charitable-reports-v3-rail > * {
	margin-top: 0;
	margin-bottom: 0;
}

/* The Activity + Top Donors pair keeps its own two-up grid inside the main column. */
body.charitable-dash-v3 .charitable-reports-v3-main .charitable-section-grid {
	margin: 0;
}

/*
The Site Analysis card comes from the dashboard, where it sits in a rail of the same width, so
it needs no size work - only its outer margin removed so the column's gap is the only spacing.
*/
body.charitable-dash-v3 .charitable-reports-v3-rail #charitable-dashboard-v2-site-analysis {
	margin: 0;
}

@media ( max-width: 1200px ) {
	body.charitable-dash-v3 .charitable-reports-v3-cols {
		grid-template-columns: minmax( 0, 1fr );
	}
}

/* ──────────────────────────────────────────────────────────────────────────
   5. Cards that carried the old row's proportions
   charitable-admin.css sets width: 66% on Top Campaigns and width: 33% on Payment Methods,
   because the two used to share one flex row. Each now owns a column, so both want all of it -
   without this Top Campaigns stops two thirds of the way across the main column and Payment
   Methods renders about 110px wide in a 330px rail, wrapping its own heading onto two lines.
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .charitable-reports-v3-main .charitable-top-campaigns-report,
body.charitable-dash-v3 .charitable-reports-v3-rail .charitable-payment-methods-report {
	width: 100%;
}

/*
The legend was 55% of a third-width card and centred, which at 330px leaves roughly 180px for
rows of "icon + name + amount" - so the amount wrapped under the name. In a rail the card IS the
narrow measure, and a centred, narrower column inside it buys nothing.
*/
body.charitable-dash-v3 .charitable-reports-v3-rail .charitable-payment-methods-report .the-legend,
body.charitable-dash-v3 .charitable-reports-v3-rail .charitable-reports-v3-sources .the-legend {
	width: auto;
	max-width: none;
	/*
	30px is the page's one card inset - see section 21. This said 20px when the cards were padded
	20, and at (0,4,1) it outranked the section 21 rule, so Payment Methods was the single card
	whose rows still sat 10px inside its own title. Corrected here, where the value lives, rather
	than by adding a longer selector on top of it.

	width:auto rather than 100% so the padding comes out of the row instead of being added to it -
	at 100% the bars ran the full 330px of the rail and touched both edges of the card.
	*/
	margin: 4px 0 0;
	padding: 0 30px;
}

/*
The donut is drawn by ApexCharts at a width it measured before these overrides applied, so it can
come out wider than the rail and clip. Capping the canvas keeps it inside the card; the chart
redraws to its container on the next render.
*/
body.charitable-dash-v3 .charitable-reports-v3-rail .charitable-payment-methods-report .the-graph,
body.charitable-dash-v3 .charitable-reports-v3-rail .charitable-payment-methods-report .apexcharts-canvas {
	max-width: 100%;
}

/* ──────────────────────────────────────────────────────────────────────────
   6. Activity as a timeline
   The icons stay and a hairline runs behind them, so the rows read as one sequence rather than
   as four unrelated entries. The row dividers come off: a connecting line and a rule per row are
   two separators doing one job, and the line is the one that says these events are ordered.

   The x is derived: .icon is 25px wide, so its centre is 12.5px in.

   The y is MEASURED, and deliberately not derived. Deriving it from charitable-admin.css gives
   32.5px - li padding-top 15px, plus the img's 5px margin, plus half of its 25px max-width. But
   the shipped activity icons are 20x19, not 25x25: max-width is a cap the art does not reach, so
   the real centre is 30px, and a derived 32.5px would start the line below the first icon and run
   it past the last. Measured against a real rendered row instead.

   Still one custom property rather than four literals, because it is art-dependent: a future icon
   set at a different size moves it.

   ⚠️ The var() calls below are written WITHOUT inner spaces on purpose. This sheet is inlined into
   the PDF, and dompdf does not trim the name inside var() - `var( --charitable-tl-x )` is looked up
   including the spaces, so it misses, resolves to 0 and emits a PHP warning for every row. That
   warning text lands ahead of the PDF bytes on any host with display_errors on and corrupts the
   download. The line also simply did not draw. Do not reformat these to match the spacing used
   elsewhere in the file.
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .charitable-activity-report .the-list ul {
	--charitable-tl-x: 12.5px;
	--charitable-tl-y: 30px;
}

body.charitable-dash-v3 .charitable-activity-report .the-list ul li {
	position: relative;
	border-bottom: 0;
}

body.charitable-dash-v3 .charitable-activity-report .the-list ul li::before {
	content: "";
	position: absolute;
	left: var(--charitable-tl-x);
	top: 0;
	bottom: 0;
	width: 1px;
	background: #e3e3e6;
}

/* Start at the first icon, stop at the last, so the line never overshoots the sequence. */
body.charitable-dash-v3 .charitable-activity-report .the-list ul li:first-child::before {
	top: var(--charitable-tl-y);
}

body.charitable-dash-v3 .charitable-activity-report .the-list ul li:last-child::before {
	bottom: auto;
	height: var(--charitable-tl-y);
}

/* A single item is a point, not a sequence - no line at all. */
body.charitable-dash-v3 .charitable-activity-report .the-list ul li:first-child:last-child::before {
	content: none;
}

/*
The icon sits on top of the line with a white ring, so the line reads as passing behind it. The
ring is a box-shadow rather than a border so it costs no layout and cannot shift the 25px column.
*/
body.charitable-dash-v3 .charitable-activity-report .the-list ul li .icon {
	position: relative;
	z-index: 1;
}

body.charitable-dash-v3 .charitable-activity-report .the-list ul li .icon img {
	background: #fff;
	border-radius: 50%;
	box-shadow: 0 0 0 3px #fff;
}

/* ──────────────────────────────────────────────────────────────────────────
   7. Goal pacing
   The percentage, the pacing state and the time left, under the existing progress bar. Pills use
   the same three-tone scale as the dashboard's Site Status - #276c35 good, #8e6c0f attention,
   #d63638 broken - so a reader who has learned one card's colours has learned this one's.
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .charitable-reports-v3-pace {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 8px;
	margin-top: 8px;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 12px;
	line-height: 1.4;
}

body.charitable-dash-v3 .charitable-reports-v3-pace-pct {
	font-weight: 600;
	color: #1e1515;
	font-variant-numeric: tabular-nums;
}

body.charitable-dash-v3 .charitable-reports-v3-pace-pill {
	display: inline-flex;
	align-items: center;
	padding: 3px 7px;
	border-radius: 20px;
	font-size: 10px;
	font-weight: 600;
	letter-spacing: 0.4px;
	line-height: 10px;
	text-transform: uppercase;
	color: #fff;
	white-space: nowrap;
}

body.charitable-dash-v3 .charitable-reports-v3-pace-pill--good { background: #276c35; }
body.charitable-dash-v3 .charitable-reports-v3-pace-pill--warn { background: #8e6c0f; }
body.charitable-dash-v3 .charitable-reports-v3-pace-pill--bad  { background: #d63638; }

/* The time left is context, not a claim, so it sits at the quiet end of the row. */
body.charitable-dash-v3 .charitable-reports-v3-pace-left {
	margin-left: auto;
	color: #646970;
}

/* The bar's fill takes the same tone, so the colour is consistent above and below. */
body.charitable-dash-v3 .charitable-reports-v3-progress--good { background-color: #276c35; }
body.charitable-dash-v3 .charitable-reports-v3-progress--warn { background-color: #dba617; }
body.charitable-dash-v3 .charitable-reports-v3-progress--bad  { background-color: #d63638; }

/* ──────────────────────────────────────────────────────────────────────────
   8. Trend arrows on the headline figures
   Inline beside the figure, which is where the dashboard puts them - a reader moving between the
   two screens sees one treatment. The approved mockup showed the arrow on its own line under the
   figure with the comparison window named; that needs the window as text too, so it waits until
   there is somewhere to put "vs. Aug 10 - 31" without crowding a centred card.
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .charitable-cards .charitable-card .charitable-dashboard-v2-stat-change {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	margin-top: 6px;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 13px;
	font-weight: 600;
	font-variant-numeric: tabular-nums;
	line-height: 1;
}

body.charitable-dash-v3 .charitable-cards .charitable-card .charitable-dashboard-v2-stat-change svg {
	flex: none;
	display: block;
}

/*
The two colours the shared helper's modifier classes select. Declared here as well as in
charitable-admin-dashboard.css because that stylesheet is not loaded on the Reports screen, so
without these the figure would inherit the card's own colour and the arrow would be the only
thing carrying the direction - which is the exact bug this replaced on the dashboard.
*/
body.charitable-dash-v3 .charitable-dashboard-v2-stat-change-positive { color: #276c35; }
body.charitable-dash-v3 .charitable-dashboard-v2-stat-change-negative { color: #dc2626; }

/* ──────────────────────────────────────────────────────────────────────────
   9. Pro Addons
   One row per active addon with a number worth reporting. Rows are divided by a 1px ground
   showing through a 1px gap rather than per-row borders, so the last row needs no special case.
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .charitable-reports-v3-addon-list {
	display: flex;
	flex-direction: column;
	gap: 1px;
	margin: 0;
	padding: 0;
	list-style: none;
	background: #e9e9eb;
}

body.charitable-dash-v3 .charitable-reports-v3-addon-list li {
	display: flex;
	align-items: center;
	gap: 10px;
	margin: 0;
	padding: 11px 20px;
	background: #fff;
}

body.charitable-dash-v3 .charitable-reports-v3-addon-icon {
	display: flex;
	align-items: center;
	justify-content: center;
	flex: none;
	width: 26px;
	height: 26px;
	border-radius: 4px;
}

body.charitable-dash-v3 .charitable-reports-v3-addon-icon img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: contain;
}

/* The fallback tile. Brand green, which carries white at 6.4:1. */
body.charitable-dash-v3 .charitable-reports-v3-addon-icon--letter {
	background: #276c35;
	color: #fff;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 12px;
	font-weight: 700;
	line-height: 1;
}

body.charitable-dash-v3 .charitable-reports-v3-addon-meta {
	flex: 1 1 auto;
	min-width: 0;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}

body.charitable-dash-v3 .charitable-reports-v3-addon-meta b {
	display: block;
	font-size: 12px;
	font-weight: 600;
	color: #1e1515;
}

body.charitable-dash-v3 .charitable-reports-v3-addon-meta span {
	font-size: 11px;
	color: #646970;
	font-variant-numeric: tabular-nums;
}

body.charitable-dash-v3 .charitable-reports-v3-addon-link {
	flex: none;
	font-size: 11px;
	color: #056aab;
	text-decoration: none;
	box-shadow: none;
}

body.charitable-dash-v3 .charitable-reports-v3-addon-link:hover {
	text-decoration: underline;
}

/* The list runs edge to edge, so the card's own inner padding comes off around it. */
body.charitable-dash-v3 .charitable-reports-v3-addons .charitable-toggle-container {
	padding: 0;
}

/* ──────────────────────────────────────────────────────────────────────────
   10. Payment Methods as money rows
   Name, amount and share on one line with a bar under it. The donut goes: in a 330px rail it
   spent most of the card on a shape carrying four numbers, and the numbers are the point.

   Bar colours follow the Site Analysis band scale in descending order of share, so the largest
   gateway reads strongest. They are ordinal, not semantic - no gateway is "good" or "bad".

   Selectors here carry the full ancestor chain on purpose. charitable-admin.css styles these rows
   at (0,3,2) with 'display: flex', which beat a leaner selector and silently defeated the grid -
   the bar became a flex item with no basis and measured 0px wide, so it simply did not appear.
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .charitable-reports-v3-rail .charitable-payment-methods-report .the-graph > #charitable-payment-methods-graph {
	display: none;
}

body.charitable-dash-v3 .charitable-reports-v3-rail .charitable-payment-methods-report #charitable-payment-methods-list {
	display: flex;
	flex-direction: column;
	gap: 14px;
	margin: 0;
	padding: 0;
	list-style: none;
}

/*
The Donation Sources coverage line, and its two empty states.

Deliberately the same type treatment as .charitable-reports-v3-tile-caption above - Inter
11.5px in #8c8f94 - because it does the same job: a quiet qualifier under a figure, not a
second headline. Restated rather than shared because that caption is scoped to the tile grid
(.charitable-cards.charitable-reports-v3-tiles), which this card is not part of; extending
that selector would have implied a relationship between the two that does not exist.
*/
body.charitable-dash-v3 .charitable-reports-v3-sources .charitable-reports-v3-sources-note {
	/*
	30px is the page's one card inset, the same value .the-legend and .header use above. Without
	it this note sat flush against both card edges while every other card's copy was inset -
	which is what it looked like on first build.
	*/
	margin: 12px 0 0;
	padding: 0 30px;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 11.5px;
	line-height: 1.5;
	color: #8c8f94;
}

/* No legend above it in the empty states, so the note carries no top gap there. */
body.charitable-dash-v3 .charitable-reports-v3-sources .charitable-report-ui > .charitable-reports-v3-sources-note {
	margin-top: 0;
}

/*
SHARED WITH THE DONATION SOURCES CARD.

Every rule in this family names two containers. The Donation Sources card in the same rail
renders an identical shape - a ranked label, a figure, and a proportional bar - so it reuses
this layout and this colour ladder rather than restating either. Adding the second selector
keeps one definition; a copy scoped to the new card would have been two definitions drifting
apart the first time a bar height or a rank colour changed.

The ladder itself is unchanged: canon brand green #31714c leads, then #5aa152, #dba617 and
#8c8f94 for the tail. Matching this file's existing values on purpose.
*/
body.charitable-dash-v3 .charitable-payment-methods-report .the-legend li.charitable-reports-v3-pm-row,
body.charitable-dash-v3 .charitable-reports-v3-sources .the-legend li.charitable-reports-v3-pm-row {
	display: grid;
	grid-template-columns: 1fr auto;
	gap: 5px 10px;
	align-items: baseline;
	margin: 0;
	padding: 0;
	border: 0;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}

body.charitable-dash-v3 .charitable-payment-methods-report .the-legend li.charitable-reports-v3-pm-row .charitable-reports-v3-pm-name,
body.charitable-dash-v3 .charitable-reports-v3-sources .the-legend li.charitable-reports-v3-pm-row .charitable-reports-v3-pm-name {
	font-size: 12px;
	font-weight: 500;
	color: #1e1515;
}

body.charitable-dash-v3 .charitable-payment-methods-report .the-legend li.charitable-reports-v3-pm-row .charitable-reports-v3-pm-amount,
body.charitable-dash-v3 .charitable-reports-v3-sources .the-legend li.charitable-reports-v3-pm-row .charitable-reports-v3-pm-amount {
	font-size: 12px;
	color: #3c434a;
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
}

body.charitable-dash-v3 .charitable-payment-methods-report .the-legend li.charitable-reports-v3-pm-row .charitable-reports-v3-pm-bar,
body.charitable-dash-v3 .charitable-reports-v3-sources .the-legend li.charitable-reports-v3-pm-row .charitable-reports-v3-pm-bar {
	grid-column: 1 / -1;
	display: block;
	height: 5px;
	border-radius: 3px;
	background: #f0f0f1;
	overflow: hidden;
}

body.charitable-dash-v3 .charitable-payment-methods-report .the-legend li.charitable-reports-v3-pm-row .charitable-reports-v3-pm-bar i,
body.charitable-dash-v3 .charitable-reports-v3-sources .the-legend li.charitable-reports-v3-pm-row .charitable-reports-v3-pm-bar i {
	display: block;
	height: 100%;
	border-radius: 3px;
	background: #31714c;
}

/*
Descending emphasis by position. nth-child is the right tool here because the list arrives
already ordered by share, so position IS rank - no extra class per row from PHP.
*/
body.charitable-dash-v3 .charitable-payment-methods-report .the-legend li.charitable-reports-v3-pm-row:nth-child( 2 ) .charitable-reports-v3-pm-bar i,
body.charitable-dash-v3 .charitable-reports-v3-sources .the-legend li.charitable-reports-v3-pm-row:nth-child( 2 ) .charitable-reports-v3-pm-bar i { background: #5aa152; }
body.charitable-dash-v3 .charitable-payment-methods-report .the-legend li.charitable-reports-v3-pm-row:nth-child( 3 ) .charitable-reports-v3-pm-bar i,
body.charitable-dash-v3 .charitable-reports-v3-sources .the-legend li.charitable-reports-v3-pm-row:nth-child( 3 ) .charitable-reports-v3-pm-bar i { background: #dba617; }
body.charitable-dash-v3 .charitable-payment-methods-report .the-legend li.charitable-reports-v3-pm-row:nth-child( n + 4 ) .charitable-reports-v3-pm-bar i,
body.charitable-dash-v3 .charitable-reports-v3-sources .the-legend li.charitable-reports-v3-pm-row:nth-child( n + 4 ) .charitable-reports-v3-pm-bar i { background: #8c8f94; }

/* ──────────────────────────────────────────────────────────────────────────
   11. Donations Breakdown: quiet days, and a ceiling
   One row per day means a month-long range is 30 rows, and on most sites nearly all of them are
   zero - a 30-day filter with a single gift rendered 29 rows of $0.00 and pushed the rest of the
   page below the fold. Days with nothing are hidden by default and can be shown again.

   The rows stay in the DOM so the toggle is a class, not a request, and the CSV export still
   contains every day.
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .charitable-section .charitable-reports-v3-row-empty {
	display: none;
}

body.charitable-dash-v3 .charitable-section.charitable-reports-v3-show-empty .charitable-reports-v3-row-empty {
	display: table-row;
}

body.charitable-dash-v3 .charitable-reports-v3-empty-days {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 10px 0 0;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 12px;
	color: #646970;
}

body.charitable-dash-v3 .charitable-reports-v3-empty-days-toggle {
	padding: 0;
	border: 0;
	background: none;
	font: inherit;
	font-weight: 500;
	/*
	inherit, so it is exactly the colour of the sentence it finishes rather than a
	grey that happens to look the same - the note is #646970 and this now cannot
	drift from it.

	The underline is permanent as a result. It was link-blue with an underline on
	hover only; take the blue away and hover-only leaves nothing to say the words
	are a control, so the underline becomes the affordance instead of the colour.
	*/
	color: inherit;
	text-decoration: underline;
	text-underline-offset: 2px;
	cursor: pointer;
}

body.charitable-dash-v3 .charitable-reports-v3-empty-days-toggle:hover,
body.charitable-dash-v3 .charitable-reports-v3-empty-days-toggle:focus-visible {
	/* Already underlined, so hover darkens the ink instead. */
	color: #1e1515;
}

/*
A ceiling on the TABLE, not on the card's whole collapse container.

520px is roughly twelve rows - enough to read as a table rather than a peephole. It used to sit on
.charitable-toggle-container, which also holds the chart, and that had two faults: the chart was
inside the scroll region, and setting overflow-y made overflow-x compute to auto, so the card grew
a horizontal scrollbar the moment the table reached its edges. Here there is nothing to scroll
sideways - the table is exactly as wide as this wrapper - and overflow-x is pinned to hidden so it
can never appear.
*/
body.charitable-dash-v3 .charitable-reports-v3-breakdown-scroll {
	max-height: 520px;
	overflow-x: hidden;
	overflow-y: auto;
}

/* The granularity note beside the Donations Breakdown heading. */
body.charitable-dash-v3 .charitable-reports-v3-granularity {
	margin-left: 14px;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 11px;
	font-weight: 600;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	color: #646970;
}

/* ──────────────────────────────────────────────────────────────────────────
   12. Headline tiles
   Label, figure, trend, caption - stacked and left-aligned. The shipping card centres a large
   figure with its label beneath, which reads as a poster rather than a row of comparable numbers;
   left-aligned, the four line up on a common left edge and scan as a set.

   Specificity carries the ancestor chain because charitable-admin.css sets the padding and
   centring at (0,3,2) on the same element.
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .charitable-cards.charitable-reports-v3-tiles .charitable-card {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 0;
	padding: 16px 18px;
	text-align: left;
}

body.charitable-dash-v3 .charitable-cards.charitable-reports-v3-tiles .charitable-reports-v3-tile-label {
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 11px;
	font-weight: 600;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: #646970;
}

body.charitable-dash-v3 .charitable-cards.charitable-reports-v3-tiles .charitable-card strong {
	margin: 4px 0 0;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 28px;
	font-weight: 600;
	line-height: 1.15;
	letter-spacing: normal;
	color: #1e1515;
	font-variant-numeric: tabular-nums;
}

/* The trend gets its own line here, unlike the dashboard's inline treatment - there is a caption
   under it naming the period, and a percentage sitting between a figure and its own explanation
   reads as part of the figure. */
body.charitable-dash-v3 .charitable-cards.charitable-reports-v3-tiles .charitable-dashboard-v2-stat-change {
	margin-top: 6px;
}

body.charitable-dash-v3 .charitable-cards.charitable-reports-v3-tiles .charitable-reports-v3-tile-caption {
	margin-top: 7px;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 11.5px;
	line-height: 1.4;
	color: #8c8f94;
	font-variant-numeric: tabular-nums;
}

/* ──────────────────────────────────────────────────────────────────────────
   13. The chevron owns the top-right corner
   On every card the collapse chevron is the last thing in the header, and anything else in that
   corner sits to its left. .alignright is a float, so the chevron needs to be in the same flex
   row as the button rather than floated separately.
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .tablenav.charitable-section > .alignright {
	float: none;
	display: flex;
	align-items: center;
	/*
	justify-content, NOT margin-left: auto.

	Dropping the float made this box span the full row - correct - but as a flex container it then
	packed its children at its own left edge, so the button and chevron sat beside the heading
	instead of at the card's right edge. The auto margin was on the CONTAINER, which had nowhere to
	move; what needed saying was where the container packs its contents.
	*/
	justify-content: flex-end;
	gap: 10px;
}

body.charitable-dash-v3 .tablenav.charitable-section > .alignright form {
	margin: 0;
}

/* ──────────────────────────────────────────────────────────────────────────
   14. Recurring Revenue
   Three figures across, each with its own label and caption. The same tile anatomy as the
   headline row, reused rather than restyled, so a reader meets one pattern twice instead of two
   patterns once.
   ────────────────────────────────────────────────────────────────────────── */

/*
THE STATS SIT IN A BOX, per the mockup's .ministats.

It was a full-bleed strip with dividers, so the three figures ran edge to edge
and the only thing separating them from the table underneath was whitespace. The
mockup bounds them: a bordered, rounded box inset from the card, which is what
gives the card the rule under its header and the rule above what follows that
they are meant to have.

The dividers are the box's own background showing through a 1px grid gap - one
colour does the border and the two dividers, so they cannot disagree. #d0d1d3 is
this page's border colour throughout (section 21); the mockup used #dcdcde,
before the page settled on one.

Shared with the locked Donation Recovery card, which uses the same strip. Both carry THREE tiles,
so this rule serves both unchanged - Recurring Revenue briefly had a fourth and a scoped override
to match, and both went when the untrustworthy MRR tile was dropped (see section 25).
*/
body.charitable-dash-v3 .charitable-reports-v3-recurring-stats {
	display: grid;
	grid-template-columns: repeat( 3, 1fr );
	gap: 1px;
	margin: 0 30px 14px;
	border: 1px solid #d0d1d3;
	border-radius: 3px;
	background: #d0d1d3;
	/* So the cells' square corners cannot poke through the box's rounded ones. */
	overflow: hidden;
}

body.charitable-dash-v3 .charitable-reports-v3-recurring-stats > div {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	padding: 14px 20px;
	background: #fff;
}

body.charitable-dash-v3 .charitable-reports-v3-recurring-stats strong {
	margin: 4px 0 0;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 22px;
	font-weight: 600;
	line-height: 1.2;
	letter-spacing: normal;
	color: #1e1515;
	font-variant-numeric: tabular-nums;
}

/*
The lapsed-plan count is the one figure in this strip that should read as a warning, so it takes
#8e6c0f - the "attention" tone of the same three-step scale as the goal pacing pills in section 7
and the dashboard's Site Status, rather than a fourth amber invented here. Not the red: on-hold
and expired plans are giving that has stopped, which is a task, not a fault in the site.

It is applied by the view only when the count is above zero. A bold amber nought would draw the
eye to the one state on this card that needs nothing doing about it.

CARRIES THE WHOLE CHAIN, including the strong, and that is load-bearing. The rule above is
(0,2,2); a bare `.charitable-reports-v3-recurring-alert` on the body is (0,2,1), which LOSES on
the element count no matter how far down the file it sits. Measured: the amber did not apply at
all on the first attempt.

The rule this replaced - .charitable-reports-v3-recurring-down, the red on a negative net in the
old month table - had the identical defect against `...-months td` and so had never once painted
anything. Two dead rules for one cause is the reason this note is here rather than in a commit
message.
*/
body.charitable-dash-v3 .charitable-reports-v3-recurring-stats strong.charitable-reports-v3-recurring-alert {
	color: #8e6c0f;
}

/*
The Pro pill in a card header. Marks the gate without hiding the card, which is the point of
showing this report live rather than behind the locked treatment.
*/
body.charitable-dash-v3 .charitable-reports-v3-pro-pill {
	display: inline-flex;
	align-items: center;
	margin-left: 8px;
	padding: 3px 7px;
	border-radius: 20px;
	background: #fc9a2a;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 10px;
	font-weight: 600;
	letter-spacing: 0.4px;
	line-height: 10px;
	text-transform: uppercase;
	color: #fff;
}

@media ( max-width: 900px ) {
	body.charitable-dash-v3 .charitable-reports-v3-recurring-stats {
		grid-template-columns: 1fr;
	}
}

/* ──────────────────────────────────────────────────────────────────────────
   15. The locked preview
   Real card chrome, sample figures behind a blur, and a centred card naming what the report
   answers. It sells by showing the SHAPE of the report rather than a feature list.

   The blur is on an inner wrapper, not the card, so the header and its "example data" note stay
   sharp - the label has to be readable or the numbers read as the site's own.
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .charitable-reports-v3-locked-body {
	position: relative;
}

body.charitable-dash-v3 .charitable-reports-v3-locked-masked {
	filter: blur( 3.5px );
	opacity: 0.42;
	pointer-events: none;
	user-select: none;
}

body.charitable-dash-v3 .charitable-reports-v3-locked-overlay {
	position: absolute;
	inset: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 16px;
}

body.charitable-dash-v3 .charitable-reports-v3-locked-card {
	max-width: 420px;
	padding: 20px 24px;
	border: 1px solid #dcdcde;
	border-radius: 5px;
	background: #fff;
	box-shadow: 0 6px 20px rgba( 30, 21, 21, 0.13 );
	text-align: center;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}

body.charitable-dash-v3 .charitable-reports-v3-locked-card h5 {
	margin: 9px 0 6px;
	font-size: 16px;
	font-weight: 700;
	color: #1e1515;
}

body.charitable-dash-v3 .charitable-reports-v3-locked-card p {
	margin: 0 0 14px;
	font-size: 12.5px;
	line-height: 1.5;
	color: #646970;
}

body.charitable-dash-v3 .charitable-reports-v3-locked-actions {
	display: flex;
	gap: 8px;
	justify-content: center;
	flex-wrap: wrap;
}

/* The pill inside the locked card has no heading beside it, so it needs no left margin. */
body.charitable-dash-v3 .charitable-reports-v3-locked-card .charitable-reports-v3-pro-pill {
	margin-left: 0;
}

/*
The "example data" note. Deliberately in the HEADER and outside the blur: sample figures that a
reader could mistake for their own are worse than no card, so the label that prevents that must
stay legible.
*/
body.charitable-dash-v3 .charitable-reports-v3-locked-note {
	margin-left: auto;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 11px;
	color: #8c8f94;
}

body.charitable-dash-v3 .charitable-reports-v3-locked .header {
	display: flex;
	align-items: center;
}

/* ──────────────────────────────────────────────────────────────────────────
   16. Compare dialog
   A panel over the page rather than a new screen: the comparison is a question about the range
   you are already looking at, and leaving the page to ask it loses the context that prompted it.
   ────────────────────────────────────────────────────────────────────────── */

/*
The dialog is hidden by the [hidden] attribute, and this rule has to say so.

The bug this fixes: giving .charitable-reports-v3-compare-dialog "display: flex" overrode the user
agent's own [hidden] { display: none }, because any author declaration beats it. The panel was
therefore visible on every page load, sitting over the report, and clicking the close button -
which sets .hidden = true - changed nothing. It read as a popup that could not be dismissed.

Stated before the layout rule so the layout cannot resurrect it, and with the attribute selector
rather than a class so the JS keeps using .hidden, which is what screen readers act on.
*/
body.charitable-dash-v3 .charitable-reports-v3-compare-dialog[hidden] {
	display: none;
}

/*
Centred both ways. It used to be pinned to the top with a 60px offset, which put it high on the
screen and well left of centre of the reader's attention on a tall report page.

align-items:center is what does the vertical centring, and it is safe with overflow-y:auto here
because the panel is short; a panel taller than the viewport would have its top clipped, which is
the usual trap with this pattern. The compare panel is a header, one row of dates and a
six-row table, so it cannot reach that height.
*/
body.charitable-dash-v3 .charitable-reports-v3-compare-dialog {
	position: fixed;
	inset: 0;
	z-index: 100050;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 20px;
	overflow-y: auto;
}

/* z-index above wp-admin's own 9990-ish chrome but below nothing else this page opens. */
body.charitable-dash-v3 .charitable-reports-v3-compare-backdrop {
	position: fixed;
	inset: 0;
	background: rgba( 30, 21, 21, 0.45 );
}

body.charitable-dash-v3 .charitable-reports-v3-compare-panel {
	position: relative;
	width: 100%;
	max-width: 720px;
	background: #fff;
	border-radius: 6px;
	box-shadow: 0 10px 40px rgba( 30, 21, 21, 0.25 );
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}

/*
THE HEADER MATCHES CHARITABLE'S OTHER ADMIN MODALS. The reference is
.charitable-modal .charitable-modal-header in charitable-universal-modal.css (the Filter Donors
dialog): a black bar, the title in rgba(255,255,255,0.9) at 18px/21px weight 600, and the close
icon pushed to the far right by space-between.

Those values are copied from that file rather than chosen here, so the two dialogs agree. The one
thing not copied is its 30px padding: the rest of this panel works to a 20px gutter, and a 30px
header would leave the title hanging inside the column of everything below it. 20px horizontally,
a little taller vertically for the bar.

The bottom border goes - the black bar is its own boundary, and a grey rule under it read as a
seam.
*/
body.charitable-dash-v3 .charitable-reports-v3-compare-panel > header {
	display: flex;
	flex-direction: row;
	flex-wrap: nowrap;
	align-items: center;
	justify-content: space-between;
	padding: 20px;
	background-color: #000;
	border-bottom: 0;
	border-radius: 6px 6px 0 0;
}

body.charitable-dash-v3 .charitable-reports-v3-compare-panel h2 {
	margin: 0;
	padding: 0;
	font-size: 18px;
	line-height: 21px;
	font-weight: 600;
	color: rgba( 255, 255, 255, 0.9 );
}

/* The same close.svg the other modals use, brightened the same way so it reads on black. */
body.charitable-dash-v3 .charitable-reports-v3-compare-x {
	display: flex;
	align-items: center;
	padding: 0;
	border: 0;
	background: none;
	line-height: 1;
	cursor: pointer;
	filter: brightness( 1.5 );
}

body.charitable-dash-v3 .charitable-reports-v3-compare-x img {
	display: block;
	width: 14px;
	height: 14px;
}

body.charitable-dash-v3 .charitable-reports-v3-compare-ranges {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	gap: 12px;
	padding: 16px 20px;
	border-bottom: 1px solid #f0f0f1;
}

body.charitable-dash-v3 .charitable-reports-v3-compare-ranges label {
	display: flex;
	flex-direction: column;
	gap: 5px;
	font-size: 11px;
	font-weight: 600;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	color: #646970;
}

/* The two date inputs of a range sit on one line, because they are one value. */
body.charitable-dash-v3 .charitable-reports-v3-compare-ranges label span {
	display: block;
}

body.charitable-dash-v3 .charitable-reports-v3-compare-ranges input {
	font-family: inherit;
	font-size: 12px;
}

/*
The Compare button in Charitable's CTA orange rather than WordPress's blue.

#fc9a2a is canon brand-orange, and since 1.8.19 it is also this file's CTA orange throughout -
the locked card's button, the spinner and the rest of the page. It replaced the as-built #e27730
so that canon and the screen agree. Same note as sections 18 and 25.

Keyed on the ID on purpose. Core paints .button-primary at (0,1,0) and a class chain would win
here, but every other button on this page has needed a specificity fight at some point - see the
locked-card rule, which lost its first attempt to a (0,4,2) selector in charitable-admin.css. The
id is already in the markup for the JS, it is (1,0,0), and it ends the argument.
*/
body.charitable-dash-v3 #charitable-compare-run.button.button-primary {
	background: #fc9a2a;
	border-color: #fc9a2a;
	color: #fff;
	box-shadow: none;
	text-shadow: none;
}

/* #fc8c0c is the hover this file already pairs with #fc9a2a on the locked card's button - the
   direct analogue of this one - so the two behave identically on hover. */
body.charitable-dash-v3 #charitable-compare-run.button.button-primary:hover,
body.charitable-dash-v3 #charitable-compare-run.button.button-primary:focus {
	background: #fc8c0c;
	border-color: #fc8c0c;
	color: #fff;
}

body.charitable-dash-v3 .charitable-reports-v3-compare-result {
	padding: 4px 20px 20px;
}

body.charitable-dash-v3 .charitable-reports-v3-compare-table {
	width: 100%;
	border-collapse: collapse;
	font-size: 12.5px;
}

body.charitable-dash-v3 .charitable-reports-v3-compare-table th {
	padding: 10px 12px 8px 0;
	border-bottom: 1px solid #dcdcde;
	font-size: 11px;
	font-weight: 600;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	color: #646970;
	text-align: left;
	white-space: nowrap;
}

body.charitable-dash-v3 .charitable-reports-v3-compare-table td {
	padding: 9px 12px 9px 0;
	border-bottom: 1px solid #f2f2f3;
	color: #3c434a;
}

body.charitable-dash-v3 .charitable-reports-v3-compare-table th.num,
body.charitable-dash-v3 .charitable-reports-v3-compare-table td.num {
	text-align: right;
	font-variant-numeric: tabular-nums;
}

body.charitable-dash-v3 .charitable-reports-v3-compare-table th:last-child,
body.charitable-dash-v3 .charitable-reports-v3-compare-table td:last-child {
	padding-right: 0;
}

/* The change cell holds the same arrow markup the tiles use, so it needs the same alignment. */
body.charitable-dash-v3 .charitable-reports-v3-compare-table .charitable-dashboard-v2-stat-change {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	font-size: 12px;
	font-weight: 600;
}

body.charitable-dash-v3 .charitable-reports-v3-compare-none {
	color: #a7aaad;
}

body.charitable-dash-v3 .charitable-reports-v3-compare-error {
	margin: 8px 0 0;
	color: #d63638;
	font-size: 12.5px;
}

/* Stop the page behind scrolling while the panel is open. */
body.charitable-compare-open {
	overflow: hidden;
}

/* ──────────────────────────────────────────────────────────────────────────
   17. Top Campaigns as a table
   Campaign, raised, goal, pacing, ends. The shipping list put four labelled facts in a paragraph
   per campaign, which cannot be compared down a column - and that comparison is the whole job of
   a "top campaigns" card.
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .charitable-reports-v3-campaigns {
	width: 100%;
	border-collapse: collapse;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 12.5px;
}

body.charitable-dash-v3 .charitable-reports-v3-campaigns th {
	padding: 0 16px 8px 0;
	border-bottom: 1px solid #dcdcde;
	font-size: 11px;
	font-weight: 600;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	color: #646970;
	text-align: left;
	white-space: nowrap;
}

body.charitable-dash-v3 .charitable-reports-v3-campaigns td {
	padding: 11px 16px 11px 0;
	border-bottom: 1px solid #f2f2f3;
	color: #3c434a;
	vertical-align: middle;
}

body.charitable-dash-v3 .charitable-reports-v3-campaigns tr:last-child td {
	border-bottom: 0;
}

body.charitable-dash-v3 .charitable-reports-v3-campaigns th.num,
body.charitable-dash-v3 .charitable-reports-v3-campaigns td.num {
	text-align: right;
	font-variant-numeric: tabular-nums;
}

body.charitable-dash-v3 .charitable-reports-v3-campaigns th:last-child,
body.charitable-dash-v3 .charitable-reports-v3-campaigns td:last-child {
	padding-right: 0;
}

body.charitable-dash-v3 .charitable-reports-v3-campaign-name a {
	color: #1e1515;
	font-weight: 500;
	text-decoration: none;
	box-shadow: none;
}

body.charitable-dash-v3 .charitable-reports-v3-campaign-name a:hover {
	text-decoration: underline;
}

/* The pacing cell: a bar and its figure on one line, the bar taking the spare width. */
body.charitable-dash-v3 .charitable-reports-v3-campaign-pacing {
	display: flex;
	align-items: center;
	gap: 9px;
	min-width: 150px;
}

body.charitable-dash-v3 .charitable-reports-v3-campaign-track {
	flex: 1 1 60px;
	height: 6px;
	border-radius: 3px;
	background: #f0f0f1;
	overflow: hidden;
}

body.charitable-dash-v3 .charitable-reports-v3-campaign-track i {
	display: block;
	height: 100%;
	border-radius: 3px;
	background: #5aa152;
}

body.charitable-dash-v3 .charitable-reports-v3-campaign-pct {
	min-width: 36px;
	text-align: right;
	font-variant-numeric: tabular-nums;
	color: #646970;
}

/* An em dash where there is no goal: no target means no progress, and a 0% bar would read as
   failure rather than as "not measured that way". */
body.charitable-dash-v3 .charitable-reports-v3-campaign-none {
	color: #a7aaad;
}

/* ──────────────────────────────────────────────────────────────────────────
   18. Email This Report, the chart's header, and the locked CTA
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .charitable-reports-v3-digest-body {
	padding: 4px 20px 18px;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}

body.charitable-dash-v3 .charitable-reports-v3-digest-body p {
	margin: 0 0 12px;
	font-size: 12px;
	line-height: 1.5;
	color: #646970;
}

/*
The state line, and it is the point of the card in this build: the button is inert because the
scheduling behind it does not exist yet, so the card has to say so rather than accept a click and
do nothing.
*/
/*
THE WEEKLY SUMMARY SWITCH.

Every declaration between here and the state rule is COPIED from
.charitable-toggle-label / -input / -switch in charitable-wpcf-migration.css, which is where the
admin's settings toggles are styled - the off grey #c3c4c7, the on green #5aa152, the 38x22 track
and the 18px knob at translateX(16px). Copied rather than converted so the switch on this card and
the switches in Settings are the same object; #5aa152 is the plugin's general-purpose green and is
not a brand value to be converged.

Reproduced here rather than by enqueueing that stylesheet, which belongs to the WPForms migration
screen and would arrive on Reports carrying everything else in it.
*/
body.charitable-dash-v3 .charitable-reports-v3-digest-controls {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	margin: 12px 0 0;
}

body.charitable-dash-v3 .charitable-reports-v3-digest-controls .charitable-toggle-label {
	display: flex;
	align-items: center;
	gap: 10px;
	margin: 0;
	cursor: pointer;
}

body.charitable-dash-v3 .charitable-reports-v3-digest-controls .charitable-toggle-input {
	position: absolute !important;
	width: 1px;
	height: 1px;
	margin: 0;
	padding: 0;
	border: 0;
	opacity: 0;
	clip: rect( 0 0 0 0 );
	overflow: hidden;
}

body.charitable-dash-v3 .charitable-reports-v3-digest-controls .charitable-toggle-switch {
	position: relative;
	flex: 0 0 38px;
	width: 38px;
	height: 22px;
	border-radius: 11px;
	background: #c3c4c7;
	transition: background-color 0.18s ease;
}

body.charitable-dash-v3 .charitable-reports-v3-digest-controls .charitable-toggle-switch::after {
	content: "";
	position: absolute;
	top: 2px;
	left: 2px;
	width: 18px;
	height: 18px;
	border-radius: 50%;
	background: #fff;
	box-shadow: 0 1px 2px rgba( 0, 0, 0, 0.25 );
	transition: transform 0.18s ease;
}

body.charitable-dash-v3 .charitable-reports-v3-digest-controls .charitable-toggle-input:checked + .charitable-toggle-switch {
	background: #5aa152;
}

body.charitable-dash-v3 .charitable-reports-v3-digest-controls .charitable-toggle-input:checked + .charitable-toggle-switch::after {
	transform: translateX( 16px );
}

body.charitable-dash-v3 .charitable-reports-v3-digest-controls .charitable-toggle-input:focus-visible + .charitable-toggle-switch {
	box-shadow: 0 0 0 2px rgba( 34, 113, 177, 0.4 );
}

body.charitable-dash-v3 .charitable-reports-v3-digest-toggle-text {
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 12px;
	font-weight: 500;
	color: #1e1515;
}

/* The switch carries the state, so the button does not need to shout. It is hidden outright when
   the summary is off - [hidden] needs saying because .button sets display. */
body.charitable-dash-v3 .charitable-reports-v3-digest-controls .button[hidden] {
	display: none;
}

body.charitable-dash-v3 .charitable-reports-v3-digest-state {
	margin: 10px 0 0 !important;
	font-size: 11px;
	color: #8c8f94;
}

body.charitable-dash-v3 .charitable-reports-v3-digest-body .button[disabled] {
	opacity: 0.65;
	cursor: not-allowed;
}

/*
The chart's header holds only a chevron, so it needs no height of its own beyond the target - and
the heading inside it is screen-reader only, because the figures above the chart already name what
it plots.
*/
body.charitable-dash-v3 .charitable-reports-v3-chart-header {
	display: flex;
	justify-content: flex-end;
	align-items: center;
	min-height: 0;
	padding: 10px 16px 0;
	border: 0;
}

/*
The locked card's primary action in Charitable's CTA orange rather than WordPress's blue-green
button-primary. This is the one place the mockup's palette and the inherited button style
disagreed, and the upsell is where brand colour earns its keep.

White on #fc9a2a measures 2.14:1, below AA for small text and below the 3:1 large-text bar.
The as-built #e27730 this replaced managed 3.04:1, so the canon conversion cost contrast here.
Flagged, not fixed: ink #1e1515 on canon orange is 8.35:1 and is the fix if these CTAs need to
be compliant, but that is a visual decision across every Charitable CTA.

The selector carries the full ancestor chain because charitable-admin.css paints this button green
at (0,4,2) - "body.charitable_page_charitable-reports .charitable-overview-report
a.button.button-primary". A leaner selector loses on specificity no matter how much later it is
declared, which is what happened on the first attempt.
*/
body.charitable-dash-v3 .charitable-overview-report .charitable-reports-v3-locked-actions a.button.button-primary {
	background: #fc9a2a;
	border-color: #fc9a2a;
	color: #fff;
	box-shadow: none;
	text-shadow: none;
}

body.charitable-dash-v3 .charitable-overview-report .charitable-reports-v3-locked-actions a.button.button-primary:hover,
body.charitable-dash-v3 .charitable-overview-report .charitable-reports-v3-locked-actions a.button.button-primary:focus {
	background: #fc8c0c;
	border-color: #fc8c0c;
	color: #fff;
}

/*
The locked card's chevron needs the body wrapper to be what collapses, not the whole card - the
toggle handler hides .charitable-toggle-container, and on this card the content lives in
.charitable-reports-v3-locked-body instead. Giving that wrapper the container class as well is
cheaper than teaching the handler a second name.
*/
body.charitable-dash-v3 .charitable-reports-v3-locked .header {
	gap: 10px;
}

/*
AUTO, not 0.

The locked header is the only one on the page set to display:flex - every other card
header is display:block, where the base stylesheet floats the chevron to the right and
lands it 31px inside the card. Under flex that float does nothing, so `margin-left: 0`
left the chevron sitting immediately after the Pro pill: 1,075px short of the corner on
a full-width main-column card, and 83px short in the rail, where it was close enough to
look intentional.

margin-left: auto restores the same result flex-natively, and absorbs the header's 10px
gap so the chevron lands on the identical 31px inset as the other eight.

The pill is what exposed this. Pro's locked header carries only a title and a chevron,
so nothing sat between them to make the misplacement visible.
*/
body.charitable-dash-v3 .charitable-reports-v3-locked .header .charitable-toggle {
	margin-left: auto;
}

/* ---------------------------------------------------------------------------
   19. Chevron alignment across every collapsible card
   ---------------------------------------------------------------------------
   Eight of the ten chevrons sat at 30px from the card's right edge and 20px
   from its top. Two did not, and both were off for the same reason: the inset
   is CUMULATIVE. The chart card carries 20px/30px of its own padding and then
   its header added 10px/16px again, landing the chevron at 30/46; the
   breakdown card is padded 20px rather than 30px, landing it at 20.

   A chevron is the control a reader goes to a corner to find, so the ten of
   them need to form one vertical line down the page - a 16px stagger is
   visible while scanning even though each one is individually "in the corner".
   Measured after the fact, not derived: the numbers above come from the
   rendered boxes.
   --------------------------------------------------------------------------- */
body.charitable-dash-v3 .charitable-reports-v3-chart-header {
	/* Zeroed so the CARD's 20px/30px is the whole inset, matching the other eight. */
	padding: 0;
}

/*
This selector must carry the WHOLE ancestor chain, and the first version did not.
'body.charitable-dash-v3 [data-section-name] .alignright' is (0,3,1) and lost to the
existing 'body.charitable-dash-v3 .tablenav.charitable-section > .alignright' at
(0,4,1), which sets align-items: center - so the rule was in the file, matched the
element, and changed nothing. Source order does not decide this; specificity does.
*/
body.charitable-dash-v3 .tablenav.charitable-section[data-section-name="donations_breakdown"] > .alignright {
	/*
	Centred, not top-aligned. An earlier version pinned the chevron to the top of
	this row to line it up with the other cards' chevrons, but this header holds
	three things of three different heights - an 18px title, a 38px button and a
	23px chevron - and the version that reads correctly is the one where all three
	share a centre line. The .alignleft rule below puts the title on that same
	line by giving it the button's height to centre within.
	*/
	align-items: center;
}

body.charitable-dash-v3 .tablenav.charitable-section[data-section-name="donations_breakdown"] > .alignleft {
	display: flex;
	align-items: center;
	/* The download button's height, so the title centres against the same band. */
	min-height: 38px;
}

/*
Inset the chart's right edge.

The breakdown card itself is padded `12px 0 16px` - no horizontal padding at all - and
the two header rows supply their own 30px instead. The chart wrapper had none, so the
plot ran the full 1262px to the card's right edge while the title and Download CSV
button sat 30px inside it, and the last x-axis label was printed hard against the
border.

30px because that is the header's own inset, which lands the chart's right edge on the
collapse chevron's - the rightmost thing in the header, measured at 1425 for both. Not
the Download CSV button: that sits ~50px further in, with the chevron to its right.

Padding-right only: the left side is already visually inset by the y-axis labels, and
padding there would double the gap.

This has to be a PADDING on the wrapper rather than a width on the chart. ApexCharts
measures its parent's content box when it renders and writes an explicit pixel width
onto .apexcharts-canvas, so the padding has to be in the CSS before it initialises -
which it is. Setting a width on the canvas instead would be overwritten on the next
resize re-render.
*/
body.charitable-dash-v3 .tablenav.charitable-section[data-section-name="donations_breakdown"] .charitable-headline-graph {
	padding-right: 30px;
}



/* ---------------------------------------------------------------------------
   20. Site Analysis, as a card in the rail
   ---------------------------------------------------------------------------
   The block itself comes from the dashboard and paints no background, so the
   card is entirely the wrapper's job. Only three things are needed: the
   positioning context for the chevron, the chevron in the same corner as the
   other nine, and removal of the bottom padding the section carries for a
   context where nothing follows it - here a footer does.
   --------------------------------------------------------------------------- */
body.charitable-dash-v3 .charitable-reports-v3-analysis {
	position: relative;
}

body.charitable-dash-v3 .charitable-reports-v3-analysis .charitable-reports-v3-analysis-toggle {
	/* Absolute, because the title it belongs beside lives inside the collapsing
	   container and cannot host it. 20/30 is the figure every other chevron
	   on this page resolves to. */
	/*
	Absolute because this chevron lives outside the collapsing container, but the
	GLYPH is the shared one: display:block at 23px/23px with no colour of its own,
	which is what .charitable-report-card .header a gives every other chevron. The
	24x24 inline-flex box at rgba(25,29,45,.6) that was here made this the only
	small, grey arrow on the page.
	*/
	position: absolute;
	top: 20px;
	right: 30px;
	z-index: 2;
	display: block;
	font-size: 23px;
	line-height: 23px;
	text-decoration: none;
	box-shadow: none;
}

body.charitable-dash-v3 .charitable-reports-v3-analysis .charitable-reports-v3-analysis-toggle .charitable-angle-down {
	transition: transform 0.3s ease;
}

/*
The rule that used to sit here set this section's padding-bottom to 4px, and it
was already dead - section 21 says so in its own note and re-declares it where it
can win. Deleted rather than left: a later edit added an id to it by accident,
which promoted a rule nobody thought was live into the one that decided the
layout, and cost a debugging pass to find.
*/

/*
The title row has to leave the corner free. "Nonprofit Site Analysis" plus its
NEW badge is the longest header in the rail, and at 330px wide it would otherwise
run under the chevron.
*/
body.charitable-dash-v3 .charitable-reports-v3-analysis .charitable-dashboard-v2-section-header {
	padding-right: 34px;
}

/* ---------------------------------------------------------------------------
   21. Card edges, one content inset, and two gaps
   ---------------------------------------------------------------------------
   Four separate reports, one cause between them: the cards had no edge and no
   shared inset, so nothing on the page agreed with anything else.

   THE BORDER. .charitable-container carries only border-radius and
   background-color #FFF - no border at all - so a card was white-on-grey and
   nothing more. Contrast measured against the #f0f0f1 page ground:

     #dcdcde  1.202:1  already in this file - reads as no edge
     #dadada  1.227:1  CANON product-ui border - still reads as no edge here
     #d0d1d3  1.342:1  <- shipped
     #c3c4c7  1.531:1  WordPress core's panel border - too heavy at this size

   #d0d1d3 sits one step inside WP core's #c3c4c7, on the same neutral hue as
   both of WP's greys. CANON IS #dadada: this is deliberately darker than canon
   because canon measures indistinguishable from having no border at all on this
   ground, and a card has to read as a card. Stated out loud rather than left to
   look like drift. #c3c4c7 was tried first and was too dark.

   THE INSET. Nine of eleven card titles sit 30px from the card's left edge, and
   every chevron sits 30px from the right. Card bodies sat at 20, 30, 35, 45 and
   56, and every footer at 20, so content stepped in and out down the page
   against a title that never moved. 30px is now the single inset: it is what
   the titles already use and it mirrors the chevron, so the card has one left
   edge and one right edge rather than five.
   --------------------------------------------------------------------------- */

body.charitable-dash-v3 .charitable-container[data-section-name],
body.charitable-dash-v3 .charitable-cards.charitable-reports-v3-tiles .charitable-card {
	border: 1px solid #d0d1d3;
}

/* Footers were 10px inside the title. */
body.charitable-dash-v3 .charitable-reports-v3-cardfoot {
	padding: 0 30px;
}

/*
Site Analysis needs the ID carried. render_site_analysis_section() emits its own
<style> with "#charitable-dashboard-v2-site-analysis .charitable-dashboard-v2-section-content
{ padding: 0 20px 20px }" - specificity (1,1,0), and a shorthand - so a class-only
rule here loses to it silently. That is also why the padding-bottom trim added in
section 20 never applied; it is folded in below where it can actually win.
*/
body.charitable-dash-v3 #charitable-dashboard-v2-site-analysis .charitable-dashboard-v2-section-content {
	padding: 0 30px 4px;
}

body.charitable-dash-v3 #charitable-dashboard-v2-site-analysis .charitable-dashboard-v2-section-header {
	/* Title sat flush at 0 - the only card whose heading touched the edge. */
	padding-left: 30px;
}

/* Pro Addons rows, Payment Methods legend, and the digest body were all at 20. */
body.charitable-dash-v3 .charitable-reports-v3-addon-list li {
	padding-left: 30px;
	padding-right: 30px;
}


body.charitable-dash-v3 .charitable-reports-v3-digest-body {
	padding-left: 30px;
	padding-right: 30px;
}

/*
Recurring Revenue and the locked Abandoned Donations share the stats strip. Only
the FIRST column moves to 30 - the inner columns keep their 20 so the dividers
between them stay where they are.
*/
/*
The first cell's 30px inset is gone: the box itself is inset now, so adding it
again would push the first figure out of line with the other two.
*/

/*
The breakdown card is padded 20 rather than 30, which is why its chevron needed a
10px nudge in section 19. Padding it to 30 aligns its heading and its table with
every other card AND lets the chevron sit at 30 on its own, so that nudge is
cancelled here rather than left to fight this rule.
*/
/*
No side padding on this card. Its own children carry the 30px inset instead, which is what lets
the table run edge to edge while still being exactly as wide as its scroll wrapper. Every other
card keeps its padding; only this one holds something that has to reach the edges.
*/
body.charitable-dash-v3 .tablenav.charitable-section.charitable-container {
	padding-left: 0;
	padding-right: 0;
}

body.charitable-dash-v3 .tablenav.charitable-section[data-section-name="donations_breakdown"] > .alignleft,
body.charitable-dash-v3 .tablenav.charitable-section[data-section-name="donations_breakdown"] > .alignright,
body.charitable-dash-v3 .charitable-reports-v3-empty-days {
	padding-left: 30px;
	padding-right: 30px;
}

/*
THE SUBNAV GAP. h2.nav-tab-wrapper carries margin-bottom: 5px, so the toolbar sat
5px under the tabs while the tiles sat 20px under the toolbar. Adjacent-sibling
margins collapse, so 20px here resolves the gap to 20 rather than to 25, and the
two gaves either side of the toolbar match.
*/
body.charitable-dash-v3 .charitable-reports-v3-toolbar {
	margin-top: 20px;
}

/*
THE FOOTER GAP. "Made with ♥ by the Charitable Team" sat 57px below the last
card, close enough that the locked card's overlay panel looked like it was
sitting on top of it. 300px is the floor asked for; it is applied to the column
wrapper so it follows whichever column happens to be longest.
*/
body.charitable-dash-v3 .charitable-reports-v3-cols {
	padding-bottom: 300px;
}

/* ---------------------------------------------------------------------------
   22. The Top Campaigns pacing note, under the title
   ---------------------------------------------------------------------------
   It sat inline after the heading, so the card led with a title and a caption
   competing for the same line. Only `display` changes here - the 11px size and
   the #8c8f94 colour are deliberately untouched, because the note's type was
   already right and only its position was wrong.

   Scoped to this card on purpose. .charitable-reports-v3-locked-note is shared
   with the "data shown below is for example purposes only" note on Abandoned
   Donations, which is meant to sit out to the right; restyling the class itself
   would drag that one onto a new line too.
   --------------------------------------------------------------------------- */
body.charitable-dash-v3 .charitable-top-campaigns-report .header .charitable-reports-v3-locked-note {
	display: block;
	margin: 2px 0 0;
}


/* ---------------------------------------------------------------------------
   23. Site Analysis title, the locked card, and a two-line card header
   --------------------------------------------------------------------------- */

/*
The Site Analysis heading is the dashboard's <h3>, so it arrived at 16.9px in
-apple-system at #1d2327 while every card beside it is an <h4> at 17px in Inter
at #303442. Same words, visibly different type. Matched to its neighbours here;
the string itself is already Title Case at source.
*/
body.charitable-dash-v3 #charitable-dashboard-v2-site-analysis .charitable-dashboard-v2-section-header h3 {
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 17px;
	font-weight: 600;
	color: #303442;
}

/*
THE LOCKED CARD MUST NEVER BE TALLER THAN THE AREA IT SITS IN. The overlay was
position:absolute over a blurred body sized only by its own content, so whenever
the CTA was the taller of the two it hung out of the bottom of the card and over
the page - visible against the footer.

Grid fixes it without a single magic number: both children occupy the SAME cell,
so the row resolves to max(blurred content, CTA) and the CTA is centred in it.
Nothing can overflow because the CTA is now one of the things setting the height.
*/
body.charitable-dash-v3 .charitable-reports-v3-locked-body {
	display: grid;
}

body.charitable-dash-v3 .charitable-reports-v3-locked-masked,
body.charitable-dash-v3 .charitable-reports-v3-locked-overlay {
	grid-area: 1 / 1;
}

/*
RELATIVE + Z-INDEX, not static, or the blur paints ON TOP OF THE CTA.

filter: blur() on .charitable-reports-v3-locked-masked makes that element a stacking context,
and a stacking context paints in step 8 of the painting order - above the backgrounds AND the
text of a static in-flow sibling, which is all the overlay was. So the faded sample was laid
over the CTA panel rather than behind it: a blurred smear across the heading and the lower
edge of the white card, which is what "the blur is affecting the readability of the CTA text"
was describing. The panel's own background was already opaque #fff, so the bleed was never an
opacity problem and could not be fixed by tuning one.

position: relative keeps the overlay in flow, so the grid sizing above still resolves the row
to max(blurred content, CTA) and nothing starts overflowing again - unlike the absolute
positioning this rule replaced. It only needs to be positioned for z-index to apply.
*/
body.charitable-dash-v3 .charitable-reports-v3-locked-overlay {
	position: relative;
	z-index: 1;
	inset: auto;
	align-self: center;
	justify-self: center;
}

/*
The CTA panel follows WPForms' pattern: addon name, one sentence, two buttons -
no badge above the name, and the secondary button carries the same colour as the
primary rather than the admin's blue. #fc9a2a is canon brand-orange, and this
file's CTA orange since 1.8.19, so the two buttons agree.
*/
body.charitable-dash-v3 .charitable-reports-v3-locked-card h5 {
	margin-top: 0;
}

body.charitable-dash-v3 .charitable-reports-v3-locked-card p {
	font-size: 13px;
}

body.charitable-dash-v3 .charitable-overview-report .charitable-reports-v3-locked-actions a.button:not( .button-primary ) {
	border-color: #fc9a2a;
	color: #fc9a2a;
	background: #fff;
	box-shadow: none;
}

body.charitable-dash-v3 .charitable-overview-report .charitable-reports-v3-locked-actions a.button:not( .button-primary ):hover,
body.charitable-dash-v3 .charitable-overview-report .charitable-reports-v3-locked-actions a.button:not( .button-primary ):focus {
	border-color: #fc8c0c;
	color: #fc8c0c;
	background: #fdf6f1;
}

/*
Top Campaigns' header is two lines now that the pacing note sits under the title,
and the chevron is floated - so it followed the text down to the second line
instead of staying in the corner. Pinned to the top-right of the header, which is
where every other chevron on this page is. Scoped to this card: it is the only
header with a second line.
*/
body.charitable-dash-v3 .charitable-top-campaigns-report .header {
	position: relative;
}

body.charitable-dash-v3 .charitable-top-campaigns-report .header .charitable-toggle {
	position: absolute;
	top: 0;
	/*
	30px, not 0. An absolutely positioned child is offset from its container's
	PADDING box, and .header spans the full inner width of the card - so right:0
	put this chevron hard against the card's edge, 30px out of line with every
	other one.
	*/
	right: 30px;
	float: none;
}

/* ---------------------------------------------------------------------------
   24. Site Analysis as a REPORT, per the mockup
   ---------------------------------------------------------------------------
   The scored state is now this card rather than the dashboard's promo section,
   so it needs its own type and layout. Values follow the mockup: a 92px ring
   with "of 100" under the figure, a filled band pill beside it over a two-line
   caption, then four label / track / value rows, then the next step on a tinted
   band with a rule down its left edge.

   The ring and bar colours are NOT set here - they come from
   site_analysis_band_color() and site_analysis_scale_color(), the same two maps
   the dashboard and the analysis tab's JS use, so the thresholds have one home.
   --------------------------------------------------------------------------- */

body.charitable-dash-v3 .charitable-reports-v3-sa-top {
	display: flex;
	align-items: center;
	gap: 14px;
	padding: 0 30px 4px;
}

body.charitable-dash-v3 .charitable-reports-v3-sa-ring {
	flex: none;
}

body.charitable-dash-v3 .charitable-reports-v3-sa-ring-value {
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 26px;
	font-weight: 700;
	fill: #1e1515;
}

body.charitable-dash-v3 .charitable-reports-v3-sa-ring-of {
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 8px;
	fill: #646970;
}

/* The pill is filled with the band colour, so its text is white rather than the band colour. */
body.charitable-dash-v3 .charitable-reports-v3-sa-band {
	display: inline-block;
	padding: 2px 9px;
	border-radius: 9px;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 10px;
	font-weight: 700;
	line-height: 15px;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	color: #fff;
}

body.charitable-dash-v3 .charitable-reports-v3-sa-summary p {
	margin: 7px 0 0;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 12px;
	line-height: 1.45;
	color: #646970;
}

body.charitable-dash-v3 .charitable-reports-v3-sa-areas {
	padding: 10px 30px 4px;
}

/*
Three columns: the label takes what it needs, the track takes the rest, and the
value is a fixed 28px so all four numbers right-align down one edge regardless of
whether they are one, two or three digits.
*/
body.charitable-dash-v3 .charitable-reports-v3-sa-area {
	display: grid;
	grid-template-columns: 84px 1fr 28px;
	align-items: center;
	gap: 10px;
	padding: 5px 0;
}

body.charitable-dash-v3 .charitable-reports-v3-sa-area-name {
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 12px;
	color: #3c434a;
}

body.charitable-dash-v3 .charitable-reports-v3-sa-area-track {
	height: 6px;
	border-radius: 3px;
	background: #f0f0f1;
	overflow: hidden;
}

body.charitable-dash-v3 .charitable-reports-v3-sa-area-fill {
	display: block;
	height: 100%;
	border-radius: 3px;
}

body.charitable-dash-v3 .charitable-reports-v3-sa-area-value {
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 12px;
	font-weight: 600;
	color: #3c434a;
	text-align: right;
	font-variant-numeric: tabular-nums;
}

/*
The next step's TYPE only. The box - border, legend, spacing - is section 28.
An earlier version of this block drew a tinted band with a 3px orange rule down
its left edge; those declarations are gone rather than left to be overridden,
so there is one rule describing this box and not two disagreeing.
*/
body.charitable-dash-v3 .charitable-reports-v3-sa-next p {
	margin: 0;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 12px;
	line-height: 1.5;
	color: #3c434a;
}

body.charitable-dash-v3 .charitable-reports-v3-sa-next-meta {
	margin-top: 5px;
	color: #646970;
}

/*
The scored card is ordinary markup, so it takes the page's own chevron rules -
only the wrapped promo needs the absolute one. Limiting that rule to the promo
keeps this card's chevron in the same flow as every other card's.
*/
body.charitable-dash-v3 .charitable-reports-v3-analysis .header {
	padding: 0 30px 14px;
}

/* ---------------------------------------------------------------------------
   25. Recurring Revenue: uppercase stat labels, and the renewals table
   ---------------------------------------------------------------------------
   The stat labels here reuse .charitable-reports-v3-tile-label, but the rule
   that makes those labels uppercase is scoped to .charitable-reports-v3-tiles -
   the four headline cards - so inside this card they rendered sentence case
   while the identical label above them was caps. Same declarations, applied
   where they were missing rather than by loosening the headline rule.
   --------------------------------------------------------------------------- */
body.charitable-dash-v3 .charitable-reports-v3-recurring-stats .charitable-reports-v3-tile-label {
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 11px;
	font-weight: 600;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: #646970;
}

body.charitable-dash-v3 .charitable-reports-v3-recurring-renewals {
	width: 100%;
	border-collapse: collapse;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}

body.charitable-dash-v3 .charitable-reports-v3-recurring-renewals th {
	padding: 12px 0 8px;
	font-size: 11px;
	font-weight: 600;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: #646970;
	text-align: left;
	border-bottom: 1px solid rgba( 24, 36, 69, 0.1 );
}

body.charitable-dash-v3 .charitable-reports-v3-recurring-renewals td {
	padding: 11px 0;
	font-size: 13px;
	color: #3c434a;
	border-bottom: 1px solid #f0f0f1;
}

body.charitable-dash-v3 .charitable-reports-v3-recurring-renewals tr:last-child td {
	border-bottom: 0;
}

/* Counts line up down a column, so they are right-aligned and tabular. */
body.charitable-dash-v3 .charitable-reports-v3-recurring-renewals .num {
	text-align: right;
	font-variant-numeric: tabular-nums;
}

/*
Four columns: a long-form date, a donor, a campaign, an amount. Only the two ends are pinned - the
date to what "September 30, 2026" needs at 13px, the amount to what a formatted figure needs at the
right edge - and donor and campaign split the rest. Campaign takes the larger share of it because
campaign titles are the longest free text on the card and the one most likely to wrap.

Percentages rather than `auto`, so the columns hold their places from row to row: with auto layout
a table of three rows sizes itself to whichever campaign name happens to be longest, and the same
card looks differently proportioned on every site.
*/
body.charitable-dash-v3 .charitable-reports-v3-recurring-renewals th:first-child,
body.charitable-dash-v3 .charitable-reports-v3-recurring-renewals td:first-child {
	width: 22%;
}

body.charitable-dash-v3 .charitable-reports-v3-recurring-renewals th:nth-child( 2 ),
body.charitable-dash-v3 .charitable-reports-v3-recurring-renewals td:nth-child( 2 ) {
	width: 26%;
}

body.charitable-dash-v3 .charitable-reports-v3-recurring-renewals th:nth-child( 3 ),
body.charitable-dash-v3 .charitable-reports-v3-recurring-renewals td:nth-child( 3 ) {
	width: 34%;
}

body.charitable-dash-v3 .charitable-reports-v3-recurring-renewals th:last-child,
body.charitable-dash-v3 .charitable-reports-v3-recurring-renewals td:last-child {
	width: 18%;
}

/*
The line under the table, and the line that stands in for it when there is nothing to renew. Same
type as a tile caption, so it reads as the table's own aside rather than as a second message.

The empty variant carries the table's own top padding, since without the table above it the note
would otherwise sit tight against the stat strip.
*/
body.charitable-dash-v3 .charitable-reports-v3-recurring-note {
	margin: 10px 0 0;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 12px;
	line-height: 1.5;
	color: #646970;
}

body.charitable-dash-v3 .charitable-reports-v3-recurring-note--empty {
	margin: 0;
	padding: 2px 30px 6px;
}

/* The table sits inside the card's 30px inset like everything else. */
body.charitable-dash-v3 .charitable-reports-v3-recurring .tablewrap {
	padding: 0 30px 4px;
	overflow-x: auto;
}

/* ---------------------------------------------------------------------------
   26. The Donations Breakdown table, per the mockup
   ---------------------------------------------------------------------------
   Three things were wrong against the mockup, all inherited from WP's widefat
   list table: an outer 1px box with a shadow around the table, alternating grey
   rows, and 14px sentence-case headers. The mockup has no box and no top rule -
   just an uppercase header row over hairline-separated rows.

   It also ran end to end there and was inset here. The table sat inside the
   card's own 30px padding AND had 30px of cell padding, so its text started at
   61px while the card title started at 31. Bleeding the table back out through
   that padding puts the row rules edge to edge and returns the text to 31, so
   the first column lines up with the heading above it.
   --------------------------------------------------------------------------- */

body.charitable-dash-v3 table.donations-breakdown {
	/*
	Exactly 100%. The card removes its own horizontal padding (below) so the rules reach both
	edges without this table having to hang outside its container - which is what forced the
	horizontal scrollbar when the container also had to scroll vertically.
	*/
	width: 100%;
	margin: 4px 0 0;
	border: 0;
	box-shadow: none;
	background: transparent;
}

body.charitable-dash-v3 table.donations-breakdown thead th {
	padding: 12px 10px 8px;
	border-top: 0;
	border-bottom: 1px solid rgba( 24, 36, 69, 0.1 );
	background: transparent;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 11px;
	font-weight: 600;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: #646970;
}

body.charitable-dash-v3 table.donations-breakdown tbody tr,
body.charitable-dash-v3 table.donations-breakdown tbody tr:hover {
	background: transparent;
}

body.charitable-dash-v3 table.donations-breakdown tbody td {
	padding: 13px 10px;
	border-top: 0;
	border-bottom: 1px solid #f0f0f1;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 13px;
	color: #3c434a;
}

/* Nothing under the final row - the card's own edge closes the table. */
body.charitable-dash-v3 table.donations-breakdown tbody tr:last-child td {
	border-bottom: 0;
}

/*
The 30px page inset, restored on the outer columns only - the table is
full-bleed, its TEXT is not.
*/
body.charitable-dash-v3 table.donations-breakdown th:first-child,
body.charitable-dash-v3 table.donations-breakdown td:first-child {
	padding-left: 30px;
}

body.charitable-dash-v3 table.donations-breakdown th:last-child,
body.charitable-dash-v3 table.donations-breakdown td:last-child {
	padding-right: 30px;
}

/* Every column but the date is a figure, so it right-aligns and goes tabular. */
body.charitable-dash-v3 table.donations-breakdown th:not( :first-child ),
body.charitable-dash-v3 table.donations-breakdown td:not( :first-child ) {
	text-align: right;
	font-variant-numeric: tabular-nums;
}

/* The empty-range row spans the table and is a sentence, so it stays left. */
body.charitable-dash-v3 table.donations-breakdown td[colspan] {
	text-align: left;
	color: #646970;
}

/* ---------------------------------------------------------------------------
   27. The Donation Recovery preview: sample rows, and a taller CTA
   ---------------------------------------------------------------------------
   The preview showed three stat tiles and nothing else, so the blurred area was
   shorter than the panel sitting on it and the card read as a CTA with a little
   smudge either side. Sample rows give it the shape of the actual report and
   make the blurred area the taller of the two, which is also what stops the
   panel from being the thing that sets the card's height.

   Styled to match the real tables on this page rather than given a look of its
   own - out of focus, a table that is laid out differently still reads as
   "different", and the point of a preview is to look like the thing it previews.
   --------------------------------------------------------------------------- */

body.charitable-dash-v3 .charitable-reports-v3-locked-sample {
	width: 100%;
	margin: 4px 0 0;
	border-collapse: collapse;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	table-layout: fixed;
}

body.charitable-dash-v3 .charitable-reports-v3-locked-sample th {
	padding: 12px 10px 8px;
	border-bottom: 1px solid rgba( 24, 36, 69, 0.1 );
	font-size: 11px;
	font-weight: 600;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: #646970;
	text-align: left;
}

body.charitable-dash-v3 .charitable-reports-v3-locked-sample td {
	padding: 12px 10px;
	border-bottom: 1px solid #f0f0f1;
	font-size: 13px;
	color: #3c434a;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

body.charitable-dash-v3 .charitable-reports-v3-locked-sample tr:last-child td {
	border-bottom: 0;
}

body.charitable-dash-v3 .charitable-reports-v3-locked-sample .num {
	text-align: right;
	font-variant-numeric: tabular-nums;
}

/* The page's 30px inset on the outer columns, as everywhere else. */
body.charitable-dash-v3 .charitable-reports-v3-locked-sample th:first-child,
body.charitable-dash-v3 .charitable-reports-v3-locked-sample td:first-child {
	padding-left: 30px;
}

body.charitable-dash-v3 .charitable-reports-v3-locked-sample th:last-child,
body.charitable-dash-v3 .charitable-reports-v3-locked-sample td:last-child {
	padding-right: 30px;
}

/*
A little more room in the panel. It was 20px/24px, which was right when it was
the tallest thing in the card and had a badge above its title; with the badge
gone and real rows behind it, it reads as cramped.
*/
body.charitable-dash-v3 .charitable-reports-v3-locked-card {
	padding: 28px 30px;
}

/* ---------------------------------------------------------------------------
   28. "Do This Next" as a legend, and the score animating in
   ---------------------------------------------------------------------------
   Was a tinted band with a 3px orange rule down its left edge. Now a fieldset:
   a thin border on all four sides with the label sitting on the top border, so
   the block is titled rather than merely flagged. The tint goes with the rule -
   a border, a fill AND a legend is three devices doing one job, and the legend
   needs the card's own background behind it to break the border cleanly.

   #d0d1d3 is the same border the cards themselves use (section 21), so the one
   bordered box inside a card matches the box around it.
   --------------------------------------------------------------------------- */

body.charitable-dash-v3 fieldset.charitable-reports-v3-sa-next {
	margin: 12px 30px 6px;
	padding: 11px 16px 13px;
	border: 1px solid #d0d1d3;
	border-radius: 4px;
	background: none;
}

body.charitable-dash-v3 fieldset.charitable-reports-v3-sa-next legend {
	padding: 0 7px;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 12px;
	font-weight: 700;
	line-height: 1;
	letter-spacing: 0.05em;
	text-transform: uppercase;
	color: #646970;
	/* The card behind it, so the legend sits ON the border rather than under it. */
	background: #fff;
}

/* ──────────────────────────────────────────────────────────────────────────
   The score drawing itself in on load.

   The ring animates stroke-dashoffset from the arc's own length to 0. With
   stroke-dasharray "<arc> <circumference>" the pattern is longer than the path,
   so exactly one segment is ever drawn; offsetting by the arc's length pushes
   that segment off the start, and running it back to 0 sweeps it into place.
   The length comes from PHP as --charitable-sa-arc on the element, because the
   keyframe cannot know a value the server computed.

   The bars scale on X from a left origin rather than animating width, so each
   one grows to whatever inline width it was given without a keyframe needing
   to know the number.
   ────────────────────────────────────────────────────────────────────────── */

@keyframes charitable-sa-draw-ring {
	from { stroke-dashoffset: var( --charitable-sa-arc, 0 ); }
	to   { stroke-dashoffset: 0; }
}

@keyframes charitable-sa-grow-bar {
	from { transform: scaleX( 0 ); }
	to   { transform: scaleX( 1 ); }
}

@keyframes charitable-sa-fade-in {
	from { opacity: 0; }
	to   { opacity: 1; }
}

body.charitable-dash-v3 .charitable-reports-v3-sa-ring-arc {
	animation: charitable-sa-draw-ring 1.1s cubic-bezier( 0.22, 0.61, 0.36, 1 ) both;
}

/* The figure inside the ring arrives with it rather than sitting there alone. */
body.charitable-dash-v3 .charitable-reports-v3-sa-ring-value,
body.charitable-dash-v3 .charitable-reports-v3-sa-ring-of {
	animation: charitable-sa-fade-in 0.5s ease-out 0.45s both;
}

body.charitable-dash-v3 .charitable-reports-v3-sa-area-fill {
	transform-origin: left center;
	animation: charitable-sa-grow-bar 0.75s cubic-bezier( 0.22, 0.61, 0.36, 1 ) both;
}

/*
Staggered down the four areas, so they read as a sequence rather than one block
of movement. Short delays - the whole thing is done inside a second.
*/
body.charitable-dash-v3 .charitable-reports-v3-sa-area:nth-child( 1 ) .charitable-reports-v3-sa-area-fill { animation-delay: 0.12s; }
body.charitable-dash-v3 .charitable-reports-v3-sa-area:nth-child( 2 ) .charitable-reports-v3-sa-area-fill { animation-delay: 0.2s; }
body.charitable-dash-v3 .charitable-reports-v3-sa-area:nth-child( 3 ) .charitable-reports-v3-sa-area-fill { animation-delay: 0.28s; }
body.charitable-dash-v3 .charitable-reports-v3-sa-area:nth-child( 4 ) .charitable-reports-v3-sa-area-fill { animation-delay: 0.36s; }

/*
Anyone who has asked their system not to animate things gets the finished state
immediately - the card is a score readout, and none of its meaning is carried by
the movement.
*/
@media ( prefers-reduced-motion: reduce ) {
	body.charitable-dash-v3 .charitable-reports-v3-sa-ring-arc,
	body.charitable-dash-v3 .charitable-reports-v3-sa-ring-value,
	body.charitable-dash-v3 .charitable-reports-v3-sa-ring-of,
	body.charitable-dash-v3 .charitable-reports-v3-sa-area-fill {
		animation: none;
	}
}

/* ---------------------------------------------------------------------------
   29. Card footers matched to the dashboard, monogram avatars, orange CTA
   ---------------------------------------------------------------------------
   FOOTERS. These are now the dashboard's "Enhance Your Campaigns" footer
   exactly - 70px tall, 0 30px, border-top rgba(24,36,69,.1), link 14px/500 at
   rgb(43,102,209) with 8px to a 16px chevron - read out of
   charitable-admin-dashboard.css:812-846 rather than approximated.

   An earlier version of this file used 46px and 13px on purpose, reasoning that
   70px in a 330px rail is a band of white taller than some cards' content. That
   was the wrong call: the footers sit at the bottom of every card down both
   columns, and matching the dashboard is what makes them read as the same
   component. Noted because the old comment argued the opposite.
   --------------------------------------------------------------------------- */

body.charitable-dash-v3 .charitable-reports-v3-cardfoot {
	height: 70px;
	padding: 0 30px;
}

body.charitable-dash-v3 .charitable-reports-v3-cardfoot a {
	font-size: 14px;
	line-height: 16px;
}

/*
MONOGRAM AVATARS. 24px circles per the mockup - #f0f0f1 ground, #646970 text,
10px/700 - on the same two tokens the mockup used (--wp-track, --wp-secondary).
Sized in the avatar box so the row keeps its existing rhythm.
*/
body.charitable-dash-v3 .charitable-top-donors-report .avatar {
	width: 34px;
	flex: none;
}

body.charitable-dash-v3 .charitable-reports-v3-donor-mono {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 34px;
	height: 34px;
	border-radius: 50%;
	background: #f0f0f1;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 12px;
	font-weight: 700;
	line-height: 1;
	letter-spacing: 0.02em;
	color: #646970;
	/* A long name cannot push the circle out of round. */
	overflow: hidden;
}

/*
THE DIGEST BUTTON in Charitable orange rather than the admin's blue primary.
#fc9a2a is canon brand-orange and this file's CTA orange, matching the locked
card's buttons and the rest of this page.

The selector deliberately matches an <a> as well as a <button>: the control was a
disabled <button> until 1.8.19 and is now a link to the email manager, and the
button it leads to must not change colour when the schedule is switched on.
*/
body.charitable-dash-v3 .charitable-overview-report .charitable-reports-v3-digest-body a.button.button-primary {
	background: #fc9a2a;
	border-color: #fc9a2a;
	color: #fff;
	box-shadow: none;
	text-shadow: none;
}

body.charitable-dash-v3 .charitable-reports-v3-digest-body .button.button-primary:hover,
body.charitable-dash-v3 .charitable-reports-v3-digest-body .button.button-primary:focus {
	background: #fc8c0c;
	border-color: #fc8c0c;
	color: #fff;
}

body.charitable-dash-v3 .charitable-reports-v3-digest-body .button.button-primary:disabled,
body.charitable-dash-v3 .charitable-reports-v3-digest-body .button.button-primary[disabled] {
	background: rgba( 252, 154, 42, 0.55 );
	border-color: rgba( 252, 154, 42, 0.55 );
	color: #fff;
	cursor: default;
}

/* ---------------------------------------------------------------------------
   30. The breakdown title on the Site Analysis title's line, and an orange CTA
   ---------------------------------------------------------------------------
   The two cards start at the same y, but their titles did not: Site Analysis's
   sits 22px into its card and the breakdown's sat at 41.

   Derived, not nudged. The breakdown card pads 16px, WP's .tablenav .alignleft
   adds margin-top:15px on top of that (row at 32), and the title then centres
   inside that row's 38px height - the height the download button sets - landing
   its ink at 32 + (38 - 18) / 2 = 42. Dropping the 15px margin and padding 12
   instead gives 12 + 10 = 22, which is where the Site Analysis title is.

   The 38px centring stays: the title, the button and the chevron sharing one
   centre line is section 19's fix and this must not undo it.
   --------------------------------------------------------------------------- */

body.charitable-dash-v3 .tablenav.charitable-section.charitable-container {
	padding-top: 12px;
}

body.charitable-dash-v3 .tablenav.charitable-section[data-section-name="donations_breakdown"] > .alignleft,
body.charitable-dash-v3 .tablenav.charitable-section[data-section-name="donations_breakdown"] > .alignright {
	margin-top: 0;
}

/*
The digest button, in Charitable orange.

THE !important AND THE [disabled] SELECTORS ARE GONE as of 1.8.19. They existed
because the button was permanently disabled - the scheduling behind it did not
exist - and WP core paints a disabled button with
"background: #f6f7f7 !important" in its own stylesheet, so nothing without
!important could win.

The button is now a live link to the email manager, so there is no core
disabled rule to beat, and keeping !important here would have made the
off-state grey unreachable without a second !important answering the first.
Removing the cause is better than stacking the workaround.

THE FULL ANCESTOR CHAIN IS REQUIRED, including the `a` and .charitable-overview-report.
charitable-admin.css paints
"body.charitable_page_charitable-reports .charitable-overview-report a.button.button-primary"
green at (0,4,2), and this card IS inside that wrapper. A leaner selector loses no
matter how much later it is declared - the same trap the locked-card rule records.
It only appeared when this control changed from a <button> to an <a> in 1.8.19: an
`a.button` selector could never match the old markup, which is what the !important
was really covering for.

The off state is handled by the [aria-disabled="true"] rule further down, which
carries the same chain plus the attribute.
*/
body.charitable-dash-v3 .charitable-reports-v3-digest-body .button.button-primary {
	background: #fc9a2a;
	border-color: #fc9a2a;
	color: #fff;
	box-shadow: none;
	text-shadow: none;
}

/* ---------------------------------------------------------------------------
   31. Top Donors: a ring on the monogram, and the meta line
   ---------------------------------------------------------------------------
   #d0d1d3 is the same border the cards use (section 21), so the circle is
   edged in the page's one border colour rather than a second grey.
   --------------------------------------------------------------------------- */
body.charitable-dash-v3 .charitable-reports-v3-donor-mono {
	border: 1px solid #d0d1d3;
	/* The border is inside the 34px, so the circle keeps the row's rhythm. */
	box-sizing: border-box;
}

/*
The line under the name - "4 donations · first gave Jan 2025". It reuses the
existing .email slot, so its type is set here rather than inheriting a style
written for an address.
*/
body.charitable-dash-v3 .charitable-reports-v3-donor-meta {
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 12px;
	line-height: 1.4;
	color: #8c8f94;
}

/* ---------------------------------------------------------------------------
   32. Donor badges, equal-height pair, aligned rows, animated payment bars
   --------------------------------------------------------------------------- */

/*
"Monthly donor" / "New donor" as pills. Same geometry as the pacing pills in
section 8 - 10px/600 uppercase in a 20px radius - so a classification looks the
same wherever this page shows one.

Tinted rather than solid, and that is the one deliberate difference. The pacing
pills are filled #276c35 / #8e6c0f / #d63638 because they carry a JUDGEMENT
(on track, at risk). How a donor gives is not good or bad news, so a solid
status colour would read as a verdict on them. The tints are the same colours at
10% over white rather than new values: #276c35 for a monthly donor, because
recurring support genuinely is the better outcome for a nonprofit, and the
page's neutral ink for a new one.
*/
body.charitable-dash-v3 .charitable-reports-v3-donor-badge {
	display: inline-flex;
	align-items: center;
	margin-left: 2px;
	padding: 2px 7px;
	border-radius: 20px;
	font-size: 10px;
	font-weight: 600;
	letter-spacing: 0.4px;
	line-height: 12px;
	text-transform: uppercase;
	white-space: nowrap;
}

body.charitable-dash-v3 .charitable-reports-v3-donor-badge--monthly {
	background: rgba( 39, 108, 53, 0.1 );
	color: #276c35;
}

body.charitable-dash-v3 .charitable-reports-v3-donor-badge--new {
	background: rgba( 25, 29, 45, 0.07 );
	color: #646970;
}

/*
EQUAL HEIGHT for the Activity / Top Donors pair.

The grid was align-items: flex-start, so each card ended wherever its content
did - fine when both happen to hold the same number of rows, and visibly ragged
as soon as one has fewer. Stretching the row is only half of it: a taller card
would otherwise leave the gap between its last row and its footer, so each card
becomes a flex column and its collapse container takes the slack. The footer
then sits on the bottom edge of both cards, which is the point.
*/
body.charitable-dash-v3 .charitable-reports-v3-main .charitable-section-grid.charitable-section-grid-column-flexible {
	align-items: stretch;
}

body.charitable-dash-v3 .charitable-reports-v3-main .charitable-section-grid > .charitable-container {
	display: flex;
	flex-direction: column;
}

body.charitable-dash-v3 .charitable-reports-v3-main .charitable-section-grid > .charitable-container > .charitable-toggle-container {
	flex: 1 1 auto;
}

/*
DONOR ROWS on one line. All three columns already started at the row's top; it
was the text inside them that did not - .name carries margin-top: 10px, putting
its ink 8px below the avatar's edge, and the amount's paragraph did the same.
Zeroed, so the name, the figure and the top of the circle share a line.
*/
body.charitable-dash-v3 .charitable-top-donors-report .the-list li {
	align-items: flex-start;
}

/*
The full ancestor chain, because the rules being overridden carry one.

"body.charitable_page_charitable-reports .charitable-report-card .the-list ul li .info p.name"
is (0,5,4) and sets margin: 10px 0 0. A leaner selector here was (0,4,2) and lost - the
declaration was in the file, matched the element, and changed nothing. Adding
.charitable-report-card and the ul/p elements takes this to (0,6,4), which wins on its own terms
rather than with !important.
*/
body.charitable-dash-v3 .charitable-top-donors-report.charitable-report-card .the-list ul li .info p.name,
body.charitable-dash-v3 .charitable-top-donors-report.charitable-report-card .the-list ul li .donor-donation-info p:first-child {
	margin-top: 0;
}

/*
PAYMENT METHODS bars draw in on load, the same way the Site Analysis areas do -
scaled on X from a left origin, so each bar grows to whatever inline width it
was given without a keyframe needing to know the number. Staggered down the
rows, and the whole thing is over inside a second.

The keyframe is shared with Site Analysis rather than duplicated; it was named
for that card when it only had one caller.
*/
body.charitable-dash-v3 .charitable-reports-v3-pm-bar i {
	transform-origin: left center;
	animation: charitable-sa-grow-bar 0.75s cubic-bezier( 0.22, 0.61, 0.36, 1 ) both;
}

body.charitable-dash-v3 .charitable-reports-v3-pm-row:nth-child( 1 ) .charitable-reports-v3-pm-bar i { animation-delay: 0.12s; }
body.charitable-dash-v3 .charitable-reports-v3-pm-row:nth-child( 2 ) .charitable-reports-v3-pm-bar i { animation-delay: 0.2s; }
body.charitable-dash-v3 .charitable-reports-v3-pm-row:nth-child( 3 ) .charitable-reports-v3-pm-bar i { animation-delay: 0.28s; }
body.charitable-dash-v3 .charitable-reports-v3-pm-row:nth-child( 4 ) .charitable-reports-v3-pm-bar i { animation-delay: 0.36s; }
body.charitable-dash-v3 .charitable-reports-v3-pm-row:nth-child( n + 5 ) .charitable-reports-v3-pm-bar i { animation-delay: 0.44s; }

/* Same contract as section 28: no animation means the FINISHED state, not an empty bar. */
@media ( prefers-reduced-motion: reduce ) {
	body.charitable-dash-v3 .charitable-reports-v3-pm-bar i {
		animation: none;
	}
}

/*
While the quiet rows are SHOWN, the sentence beside the control must not still
say they are hidden. Noticed when the toggle's own styling was being changed:
expanding left "11 weeks with no donations are hidden." sitting next to a button
offering to hide them. The button's label already states the state, so the
sentence simply goes for the duration - CSS only, off the class the toggle
already sets, so no second string and no JS change.
*/
body.charitable-dash-v3 .charitable-reports-v3-show-empty .charitable-reports-v3-empty-days > span {
	display: none;
}

/* ---------------------------------------------------------------------------
   33. What the page says while it reloads, and when there is nothing to plot
   ---------------------------------------------------------------------------
   Filtering dimmed every .charitable-report-ui to 25% and said nothing, so the
   screen went pale with no sign it was working. Fixed rather than absolute, so
   it is centred on the SCREEN wherever the reader has scrolled to - the report
   is taller than the viewport and a panel centred in the document would often
   be off-screen exactly when it matters.
   --------------------------------------------------------------------------- */

body.charitable-dash-v3 .charitable-reports-v3-loading {
	position: fixed;
	inset: 0;
	z-index: 9999;
	display: flex;
	align-items: center;
	justify-content: center;
	/* No ground of its own: the dimmed page behind it is the ground. */
	pointer-events: none;
}

/* [hidden] is only display:none until an author display wins, and this rule sets one. */
body.charitable-dash-v3 .charitable-reports-v3-loading[hidden] {
	display: none;
}

body.charitable-dash-v3 .charitable-reports-v3-loading-panel {
	max-width: 320px;
	padding: 22px 26px;
	border: 1px solid #d0d1d3;
	border-radius: 5px;
	background: #fff;
	box-shadow: 0 8px 28px rgba( 30, 21, 21, 0.16 );
	text-align: center;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}

body.charitable-dash-v3 .charitable-reports-v3-loading-title {
	margin: 12px 0 0;
	font-size: 14px;
	font-weight: 600;
	color: #1e1515;
}

body.charitable-dash-v3 .charitable-reports-v3-loading-note {
	margin: 5px 0 0;
	font-size: 12px;
	line-height: 1.45;
	color: #646970;
}

/*
The spinner. #fc9a2a on the moving arc over a #f0f0f1 track - canon brand-orange,
matching the rest of the page.
*/
body.charitable-dash-v3 .charitable-reports-v3-spinner {
	display: inline-block;
	width: 26px;
	height: 26px;
	border: 3px solid #f0f0f1;
	border-top-color: #fc9a2a;
	border-radius: 50%;
	animation: charitable-reports-v3-spin 0.8s linear infinite;
}

@keyframes charitable-reports-v3-spin {
	to { transform: rotate( 360deg ); }
}

/*
Reduced motion gets a still ring rather than a spinner. The words carry the
message, so nothing is lost by holding it steady.
*/
@media ( prefers-reduced-motion: reduce ) {
	body.charitable-dash-v3 .charitable-reports-v3-spinner {
		animation: none;
	}
}

/* ──────────────────────────────────────────────────────────────────────────
   Nothing to plot.
   An empty range drew axes and a flat line on zero, which reads as a broken
   chart. The chart is hidden and the reason takes its place, sized so the card
   does not jump between the two states.
   ────────────────────────────────────────────────────────────────────────── */

body.charitable-dash-v3 .charitable-reports-v3-graph-wrap {
	position: relative;
}

body.charitable-dash-v3 .charitable-reports-v3-graph-none {
	display: none;
	margin: 0;
	padding: 48px 30px;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 13px;
	color: #646970;
	text-align: center;
}

/*
Keyed off the CARD, not the chart's wrapper, because the empty state governs the
table as well - and an empty table under a sentence saying the same thing is
worse than no table. One class, several effects.

THE CHART STAYS, blank. An earlier version hid it and put the sentence in its
place, which reads as the card having lost a feature rather than the range
having no data - the plot area is where a reader looks, so that is where the
answer belongs. The sentence is laid over the middle of it, which is the
conventional way to say a chart has no data rather than no chart.

What renders is the y-axis and its gridlines with nothing plotted. There are no
DATES along the bottom, because the axis is built from the breakdown's buckets
and an empty range produces none - measured, not assumed. Filling the x-axis
from the range itself would make this a better empty state, and is a change to
bucket_for_range() rather than to this file.
*/
body.charitable-dash-v3 .charitable-reports-v3-breakdown-empty .charitable-reports-v3-graph-none {
	display: block;
	/* Centred over the plot. The wrap is the positioning context - section 33. */
	position: absolute;
	inset: 0;
	height: -moz-fit-content;
	height: fit-content;
	margin: auto;
	padding: 0 30px;
}

/* The table, its header and its download button have nothing to act on. */
body.charitable-dash-v3 .charitable-reports-v3-breakdown-empty .charitable-reports-v3-breakdown-scroll,
body.charitable-dash-v3 .charitable-reports-v3-breakdown-empty .charitable-report-download-form {
	display: none;
}

/* ---------------------------------------------------------------------------
   34. The unrun Site Analysis card
   ---------------------------------------------------------------------------
   Every rule here carries BOTH .charitable-reports-v3-analysis - the wrapper
   this page puts round the dashboard's promo section, so the dashboard's own
   copy is untouched - AND the #charitable-dashboard-v2-site-analysis id.

   The id is not decoration. render_site_analysis_section() emits its own <style>
   block using that id, and an id beats any chain of classes however long, so the
   first version of this section matched the elements and changed nothing at all.
   Third time this page has charged me for that; the tell is a rule that is
   present, matching, and inert.
   --------------------------------------------------------------------------- */

/*
NO GROUND UNDER THE ICON, and the glyph on the headline's own left edge.

The icon was a 40x40 tile with the brand orange at 12% behind it, which put the
glyph 9px in from the tile's edge - so the card had two left edges, the headline
at 31px and the mark at 40px. Dropping the tile lets the glyph sit where the
headline sits. The background is removed rather than restyled, so no colour is
introduced.
*/
body.charitable-dash-v3 .charitable-reports-v3-analysis #charitable-dashboard-v2-site-analysis .charitable-sa-dash-icon {
	display: block;
	width: auto;
	height: auto;
	padding: 0;
	border-radius: 0;
	background: none;
}

/* The glyph itself, now that nothing is centring it in a tile. */
body.charitable-dash-v3 .charitable-reports-v3-analysis #charitable-dashboard-v2-site-analysis .charitable-sa-dash-icon .dashicons {
	display: block;
	width: 26px;
	height: 26px;
	font-size: 26px;
	line-height: 26px;
	/* Canon brand orange, the colour the tile was tinting - now on the mark itself. */
	color: #fc9a2a;
}

/*
THE NEW BADGE GOES UNDER THE HEADLINE. Beside it, the badge and the collapse
chevron were competing for the same corner, and the headline had to wrap early
to leave room for both.
*/
body.charitable-dash-v3 .charitable-reports-v3-analysis #charitable-dashboard-v2-site-analysis .charitable-sa-dash-new {
	display: table;
	margin: 5px 0 0;
}

/*
BOTTOM PADDING MATCHES THE OTHER THREE SIDES. The card pads 30px left, right and
top, and 4px at the bottom - the 4 was correct when a footer followed, and this
state has no footer since it links to an analysis that does not exist yet. So
the button sat 5px off the card's edge.
*/
body.charitable-dash-v3 .charitable-reports-v3-analysis #charitable-dashboard-v2-site-analysis .charitable-dashboard-v2-section-content {
	padding-bottom: 30px;
}

/* ---------------------------------------------------------------------------
   35. LYBUNT / SYBUNT: undo the breakdown table's right-alignment
   ---------------------------------------------------------------------------
   The advanced report's donor table carries class="donations-breakdown" - the
   SAME class as the Donations Breakdown table on the Overview tab - so section
   26's rule

     body.charitable-dash-v3 table.donations-breakdown th:not(:first-child),
     body.charitable-dash-v3 table.donations-breakdown td:not(:first-child)
       { text-align: right }

   reached it and right-aligned Name, Last Donation, both Total Donations
   columns and Last Campaign. That rule is correct where it was written: on the
   Overview every column after the first IS a figure. Here only one is.

   Scoped by .charitable-advanced-report, the wrapper this table sits in and the
   Overview's does not, rather than by narrowing section 26 - the Overview
   table's own ancestry has no reliable hook (its .charitable-overview-report
   closes ABOVE the table), so narrowing it risked losing the alignment it is
   actually for.

   Specificity is load-bearing, as ever. Section 26's selector is (0,3,3) -
   .charitable-dash-v3, .donations-breakdown and the :not() count as three
   classes, body/table/th as three elements. Adding .charitable-advanced-report
   makes these (0,4,3), so they win on weight and not on source order.

   Life Total stays right: it is the only figure in the row. It is matched by
   CLASS and never by :last-child, because generate_lybunt_rows() appends a
   column-actions cell AFTER it when the report is rendered with actions
   (get_advanced_report_table_meta(), $show_actions), and :last-child would then
   right-align the action button and leave the money left.
   --------------------------------------------------------------------------- */
body.charitable-dash-v3 .charitable-advanced-report table.donations-breakdown th:not(:first-child),
body.charitable-dash-v3 .charitable-advanced-report table.donations-breakdown td:not(:first-child) {
	text-align: left;
}

body.charitable-dash-v3 .charitable-advanced-report table.donations-breakdown th.column-life-total,
body.charitable-dash-v3 .charitable-advanced-report table.donations-breakdown td.column-net {
	text-align: right;
}

/* ---------------------------------------------------------------------------
   36. Donor reports: centre the action button in its row
   ---------------------------------------------------------------------------
   WP core's common.css sets `.widefat td { vertical-align: top }`, and NOTHING
   in this plugin overrides it for these report tables - measured: no stylesheet
   on the page carried a single .donor-breakdown selector before this one.

   That is right for the cells holding two or three lines (a name over an email,
   an amount over a campaign over a date) and wrong for the one holding a 30px
   button: in a 75px row the button sat 8px from the top with 37px of space
   under it, reading as though it belonged to the row above.

   Only the actions cell is re-aligned. Centring the whole row would drag the
   multi-line cells off the top edge they are deliberately aligned to, which is
   the alignment the row is built around.

   Core's rule is (0,1,1), so this wins comfortably at (0,3,3) - no !important
   needed, and it stays scoped to these two report tables rather than every
   .widefat on the page.

   ⚠️ CLASSIC IS STILL AFFECTED. The cause is core CSS that loads regardless of
   the v3 preview flag, and this stylesheet only loads WITH it, so the classic
   reports tab keeps the top-aligned button. Fixing that means editing
   charitable-admin.css, which has BOTH an .scss source and a .min sibling - a
   recompile there can silently drop rules the CSS has and the SCSS lacks, so it
   wants its own pass rather than a drive-by from here.
   --------------------------------------------------------------------------- */
body.charitable-dash-v3 table.donor-breakdown td.column-actions,
body.charitable-dash-v3 table.donations-breakdown td.column-actions {
	vertical-align: middle;
}


/* ──────────────────────────────────────────────────────────────────────────
   The weekly summary's NEW pill.

   THE SAME BADGE AS NONPROFIT SITE ANALYSIS, declaration for declaration:
   #31714c with white text, 10px/600, .4px letter-spacing, uppercase, 3px 7px,
   radius 20px. Those come from the inline <style> block that
   render_site_analysis_section() emits (class-charitable-dashboard.php, keyed on
   #charitable-dashboard-v2-site-analysis), which is why the values are copied
   rather than the class reused - that block is scoped to an ID this card is not
   inside, so .charitable-sa-dash-new would arrive here carrying nothing.

   #31714c is canon brand green, so this is canon rather than drift.
   ────────────────────────────────────────────────────────────────────────── */


body.charitable-dash-v3 .charitable-reports-v3-new-pill {
	/* display:table + the 5px top margin are what Nonprofit Site Analysis uses to drop
	   its own pill onto the line under the heading - see the charitable-sa-dash-new rule
	   in section 35. Same two declarations, so the two cards space it identically. */
	display: table;
	margin: 5px 0 0;
	padding: 3px 7px;
	border-radius: 20px;
	background: #31714c;
	color: #fff;
	font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	font-size: 10px;
	font-weight: 600;
	line-height: 1;
	letter-spacing: 0.4px;
	text-transform: uppercase;
}

/* The Manage button while the summary is off: present, so the card shows there is
   somewhere to go, but clearly not actionable. Greyed rather than orange-at-reduced-
   opacity, because a faded brand button reads as a loading state. */
body.charitable-dash-v3 .charitable-overview-report .charitable-reports-v3-digest-controls a.button.button-primary[aria-disabled="true"] {
	background: #dcdcde;
	border-color: #dcdcde;
	color: #8c8f94;
	box-shadow: none;
	text-shadow: none;
	cursor: not-allowed;
	pointer-events: none;
}
