:root {
  --purple: #6d1afe;
  --navy: #21325e;
  --sky: #75deff;
}

/* 1.8.0 sizes column charts itself. A category's bars now sit together and
   centred, `layout: "fit"` sizes the card to the chart, and `valueLabels:
   "bar"` puts each value on top of its own bar. The width cap, the panel cap
   and the shortened track this report used to carry are all gone: the three
   column charts set those two options instead and the kit does the rest.

   Only the panel header is still adjusted. Inside a chart-narrative the chart
   has roughly three fifths of the slide, which is not enough to hold a chart
   title and its base pill on one row, so the row is allowed to wrap and the
   base drops beneath the title. That is the same reading order. */
.chart-narrative__chart .panel__header {
  flex-wrap: wrap;
}

/* A one-entry legend states what the chart title already states, and the deck
   draws no legend on any of its 35 single-series bar or column charts. The kit
   writes the legend unconditionally, so it is hidden here on panels the kit
   itself marks as carrying one series. Multi-series panels keep theirs, and the
   screen-reader text inside each bar is untouched, so the series name is still
   announced. The one legend that carried something its title did not, the year
   on the buy-side growth drivers chart, is now in that chart's base pill in the
   deck's own wording. */
.comparison-panel[style*="--series-count:1;"] .chart-legend {
  display: none;
}

/* The deck prints no scale caption on any chart, and every bar in this report
   carries its own value as text, so the caption states something the reader can
   already see. The data table below each chart still states every value. */
.comparison-panel > .micro-note {
  display: none;
}

/* The column track is drawn as a repeating gradient, which leaves one or two
   faint gridline fragments standing above each column once the bar is shorter
   than the track. The deck's column charts carry no gridlines at all. Removing
   the image leaves the track transparent and keeps the axis rule beneath it,
   on both bar and column panels and in both colour modes. */
.comparison-chart .comparison-track,
.comparison-chart--columns .comparison-track {
  background-image: none;
}

/* On the chart-and-analysis slides the source sets a short bold line above each
   paragraph of analysis. The component renders every paragraph alike, so the
   lead-in lines are given back the weight and colour they carry in the source.
   The positions are named per slide rather than taken as every odd paragraph,
   because the bodies are not all the same length: slide 10 runs its first block
   as two paragraphs, as the deck does, two slides close on an NB line, the
   method slide carries a single subheading over three bullets, and the AI
   slide closes on its conclusion. */
/* Every one of these is a child combinator, deliberately. A descendant selector also
   matches the lead paragraph inside a .rich-list, because that paragraph is the first
   child of its own div, which set the first line of several analysis columns in bold as
   though it were a heading once the lists arrived. Only a direct child of the analysis
   column is a deck heading. */
#slide-method-and-sample .chart-narrative__text .rich-list > p,
#slide-seller-development-priorities .chart-narrative__text > p:nth-child(1),
#slide-buyers-picking-where-it-bites .chart-narrative__text > p:nth-child(1),
#slide-buyers-picking-where-it-bites .chart-narrative__text > p:nth-child(3),
#slide-shift-to-longer-term-partnerships .chart-narrative__text > p:nth-child(1),
#slide-shift-to-longer-term-partnerships .chart-narrative__text > p:nth-child(4),
#slide-roas-dethroned .chart-narrative__text > p:nth-child(1),
#slide-roas-dethroned .chart-narrative__text > p:nth-child(3),
#slide-opportunity-moving-to-data .chart-narrative__text > p:nth-child(1),
#slide-opportunity-moving-to-data .chart-narrative__text > p:nth-child(4),
#slide-barriers-intensifying .chart-narrative__text > p:nth-child(1),
#slide-barriers-intensifying .chart-narrative__text > p:nth-child(3),
#slide-sellers-narrowed-growth-expectations .chart-narrative__text > p:nth-child(1),
#slide-sellers-narrowed-growth-expectations .chart-narrative__text > p:nth-child(3),
#slide-buy-side-growth-agenda .chart-narrative__text > p:nth-child(1),
#slide-buy-side-growth-agenda .chart-narrative__text > p:nth-child(3),
#slide-sellers-are-building .chart-narrative__text > p:nth-child(1),
#slide-sellers-are-building .chart-narrative__text > p:nth-child(3) {
  margin-bottom: .35em;
  color: var(--navy);
  font-weight: 700;
}

/* Two slides close their analysis column on the deck's NB line, so that paragraph
   is set as a note rather than as body text. */
#slide-sellers-narrowed-growth-expectations .chart-narrative__text > p:nth-child(5),
#slide-sellers-are-building .chart-narrative__text > p:nth-child(5) {
  margin-bottom: 0;
  color: var(--muted);
  font-size: .86em;
  line-height: 1.5;
}

/* The AI slide closes on a conclusion the deck sets in pink across the whole
   paragraph, so the paragraph takes the deck's emphasis whole. The two slides
   that used to sit beside it here, the opportunity slide and the funded-by-brand
   slide, are both partial highlights and are now set run by run under v5.8. */
#slide-buyers-picking-where-it-bites .chart-narrative__text > p:nth-child(5) {
  margin-bottom: 0;
  color: var(--deck-pink);
  font-weight: 700;
}

/* Two slides label their right-hand column, above the analysis and on the same
   line as the slide eyebrow: "2026 OBSERVATIONS (ALL RESPONDENTS)" on the
   partnerships slide and "ALL BUYERS 2026 OBSERVATIONS" on the barriers slide.
   The kit has no field for a column label, so the two labels are set here, in
   the position the deck gives them and in the same treatment as the eyebrow.
   Below 900px the two columns stack and the label stays at the head of the
   analysis, which is still what it labels. */
#slide-shift-to-longer-term-partnerships .chart-narrative__text::before,
#slide-barriers-intensifying .chart-narrative__text::before {
  display: block;
  margin: 0 0 .9rem;
  color: var(--purple);
  font-size: .74rem;
  font-weight: 800;
  letter-spacing: .15em;
  text-transform: uppercase;
}

#slide-shift-to-longer-term-partnerships .chart-narrative__text::before {
  content: "2026 OBSERVATIONS (ALL RESPONDENTS)";
}

#slide-barriers-intensifying .chart-narrative__text::before {
  content: "ALL BUYERS 2026 OBSERVATIONS";
}

/* A doughnut slide carrying one chart gets both columns of the visual grid,
   which left the ring and its legend in a card running the width of the
   slide. The cap brings the card in to the width its own content needs, so
   the white space is margin outside the card rather than a void inside it.
   38rem holds the ring, the gap, the panel padding and a legend column of
   about 310px, enough for the longest label to sit on one line at desktop
   width. The second doughnut now sits beside its analysis instead and is not
   selected here. */
.general-charts > .panel:has(.doughnut-layout) {
  max-width: 38rem;
}

/* The six "in their words" slides carry verbatim interview quotations, which
   are not an ordered list of points, so the card's decorative ordinal is
   dropped and the quotation starts the card. Everything else about the card,
   including the coloured rule across the top, is the component's. */
#slide-voices-committed-not-mature .qualitative-card__number,
#slide-voices-money-moving .qualitative-card__number,
#slide-voices-first-party-data .qualitative-card__number,
#slide-voices-measurement-and-data .qualitative-card__number,
#slide-voices-roas-demoted .qualitative-card__number,
#slide-voices-standards-uptake .qualitative-card__number {
  display: none;
}

/* ------------------------------------------------------------------------- */
/* v5: bulleted lists, the deck's pink emphasis, and the quote slides.        */
/* ------------------------------------------------------------------------- */

/* 1.9.0 renders a list field as <div class="rich-list"><p>lead</p><ul><li>. The deck
   sets its bullets indented under their lead line, so that is the default here. */
.rich-list > p {
  margin: 0 0 .5em;
}

.rich-list ul,
.rich-list ol {
  margin: 0;
  padding-left: 1.15em;
}

.rich-list li + li {
  margin-top: .45em;
}

/* v5 gave each highlighted sentence a line of its own, because a run inside a
   sentence could not be coloured. v5.8 sets those runs where the deck sets them, in
   line, and every rule that put a highlight on its own line has gone with it. The one
   survivor is below: this slide's highlight is a whole paragraph in the deck too. */
#slide-measuring-discovery-in-the-assistant .takeaway {
  color: var(--deck-pink);
  font-weight: 700;
}

/* The tested-shifts table carries the deck's footnote, which is a source line and not a
   conclusion, so it is set like the small note under every other slide rather than as
   the emphasised takeaway the component would otherwise give it. */
#slide-tested-year-on-year-shifts > .slide-inner > .takeaway {
  margin-top: .8rem;
  padding: 0;
  border: 0;
  background: none;
  color: var(--muted);
  font-size: .78rem;
  font-weight: 400;
  line-height: 1.45;
}

/* The tested movement on each of these four slides is the point of the slide, so it is
   stated on the face rather than in a footnote, in the deck's pink and a size up. */
#slide-shift-to-longer-term-partnerships > .slide-inner > .takeaway,
#slide-opportunity-moving-to-data > .slide-inner > .takeaway,
#slide-barriers-intensifying > .slide-inner > .takeaway,
#slide-roas-dethroned > .slide-inner > .takeaway {
  color: var(--deck-pink);
  font-size: 1.08em;
  font-weight: 700;
}

/* The deck's closing line on the barriers slide, "This is the finding that sets up the rest
   of the report.", is body paragraph 5 on that slide rather than part of this block, so it
   follows the highlighted paragraph as the deck runs it. It needs no rule of its own: it is
   a plain paragraph and the lead-in rules above select only paragraphs 1 and 3, which are
   the slide's two deck headings. */

/* "What it means" is the conclusion of each card, so it is set on its own line and a
   little larger than the figures above it. */
#slide-four-significant-shifts .rich-list ul,
#slide-five-to-watch .rich-list ul {
  list-style: none;
  padding-left: 0;
}

#slide-four-significant-shifts .rich-list li,
#slide-five-to-watch .rich-list li {
  margin-top: .6em;
  color: var(--navy);
  font-size: 1.08em;
  font-weight: 600;
}

/* A quotation is the whole content of these six cards, so it carries the slide rather than
   sitting as supporting text. The component puts the quotation in the card's h3 and the
   attribution in the paragraph beneath it, which is the opposite of what it looks like:
   an earlier attempt enlarged the paragraph and so grew the attribution and left the quote
   at an ordinary card title's size. It is the h3 that has to move. The deck sets these
   quotations large, italic and in regular weight, with the attribution small and bold, so
   the weight comes off the quotation as well as the size going on. The paragraph is left
   at the size the component gives it. */
#slide-voices-committed-not-mature .qualitative-card h3,
#slide-voices-money-moving .qualitative-card h3,
#slide-voices-first-party-data .qualitative-card h3,
#slide-voices-measurement-and-data .qualitative-card h3,
#slide-voices-roas-demoted .qualitative-card h3,
#slide-voices-standards-uptake .qualitative-card h3 {
  margin-bottom: .55rem;
  font-size: clamp(1.12rem, 1.5vw, 1.3rem);
  font-style: italic;
  font-weight: 400;
  line-height: 1.4;
}

/* Neither of the deck's two tables shades its cells by value. The kit shades every
   matrix cell on a four-step blue scale that tracks percentage size, which on the
   tested-shifts table competed with the significance emphasis the deck actually
   uses, and on the MENA table said something about the numbers the deck does not
   say. The scale is dropped on both. The cells keep the body ink, which resolves
   light or dark, so the values stay legible either way. These selectors carry an
   id, so they outrank the kit's own dark-mode heat rules as well as its light
   ones, and no !important is needed. */
#slide-tested-year-on-year-shifts .heat-cell,
#slide-mena-profile-comparison .heat-cell {
  background: transparent;
  color: var(--navy);
  font-weight: 600;
}

/* Both deck tables set their header row as a navy band with reversed type, so both
   tables here do the same. In dark mode the two tokens swap round on their own and
   the band inverts with the rest of the page. */
#slide-tested-year-on-year-shifts .heat-table thead th,
#slide-mena-profile-comparison .heat-table thead th {
  background: var(--navy);
  border-bottom-color: var(--navy);
  color: var(--white);
}

/* The MENA table is a plain reference table in the deck, banded in pale lavender on
   alternate rows. The tested-shifts table is deliberately not banded: its only row
   emphasis is the significance highlight below, which banding would compete with. */
#slide-mena-profile-comparison .heat-table tbody tr:nth-child(even) th,
#slide-mena-profile-comparison .heat-table tbody tr:nth-child(even) td {
  background: rgba(109, 26, 254, .06);
}

@media screen {
  html[data-report-dark="true"] #slide-mena-profile-comparison .heat-table tbody tr:nth-child(even) th,
  html[data-report-dark="true"] #slide-mena-profile-comparison .heat-table tbody tr:nth-child(even) td {
    background: rgba(185, 156, 255, .1);
  }
}

/* The tested-shifts table carries the deck's own footnote, which ends "Highlighted
   rows clear the 95% bar". The deck highlights four rows for significance; the kit
   highlights nothing, and the shading it does apply to the data cells runs by
   percentage size, in the same family of pale blues. Left alone, that sentence
   would point at nothing while a different shading sat beside it, which is the
   kind of thing a reader resolves by assuming the blue cells are the significant
   ones. So the deck's own row emphasis is reproduced on the four rows whose shift
   is significant, rows 1, 4, 6 and 8, on the row label rather than across the
   whole row, which leaves the kit's value shading in the data cells intact. */
#slide-tested-year-on-year-shifts .heat-table tbody tr:nth-child(1) th,
#slide-tested-year-on-year-shifts .heat-table tbody tr:nth-child(4) th,
#slide-tested-year-on-year-shifts .heat-table tbody tr:nth-child(6) th,
#slide-tested-year-on-year-shifts .heat-table tbody tr:nth-child(8) th,
#slide-tested-year-on-year-shifts .heat-table tbody tr:nth-child(1) td,
#slide-tested-year-on-year-shifts .heat-table tbody tr:nth-child(4) td,
#slide-tested-year-on-year-shifts .heat-table tbody tr:nth-child(6) td,
#slide-tested-year-on-year-shifts .heat-table tbody tr:nth-child(8) td {
  color: var(--navy);
  font-weight: 700;
}

/* The weight has to be set on both sides of the rule, not just the bold one. The kit makes
   every row-header th 800 by default and the cells were left at 600, so all nine labels
   read bold and the other five rows' figures read semi-bold: the footnote's "Rows in bold
   clear the 95% bar" was not true of what the table drew. The deck sets the four
   significant rows bold across label and figures and leaves the other five regular, which
   is what these two declarations produce. Weight only, so both colour modes are covered. */
#slide-tested-year-on-year-shifts .heat-table tbody th,
#slide-tested-year-on-year-shifts .heat-table tbody td {
  font-weight: 400;
}

/* The four tested shifts are now the same component as the five to watch beside them, so
   the two slides share one typography and both give "What it means" its own line. Two
   things that needed rules under the conclusion component now come free: the card ordinal
   is the shift itself, "+21pts*", so it is shown rather than hidden, and the kit's own
   card grid already falls to two by two at four cards, which is the shape the source
   uses. The rules the conclusion version needed have gone with it. */

/* That slide now carries the deck's own title, so the label that had been
   standing in for it sits above the cards as the source has it, set as a label
   rather than as a standfirst. */
#slide-four-significant-shifts .slide-head .lede {
  color: var(--purple);
  font-size: .74rem;
  font-weight: 800;
  letter-spacing: .15em;
  text-transform: uppercase;
}

/* The supporters slide is the deck's back cover, so it loses the section
   divider's large ordinal and its two-column frame, and the credit is centred
   and set below the heading size a section divider uses. Nothing here should
   read as the start of a section. */
#slide-supporters .chapter-ordinal {
  display: none;
}

#slide-supporters .chapter-frame {
  grid-template-columns: minmax(0, 1fr);
  justify-items: center;
  min-height: 52vh;
  text-align: center;
}

#slide-supporters h2 {
  max-width: 22ch;
  font-size: clamp(1.9rem, 3.6vw, 3.2rem);
  line-height: 1.1;
}

/* The deck's back cover also carries the IAB Europe address and its handles,
   set small and quiet below the credit. The component's definition slot is
   normally the second column of the divider frame, so it is moved back into the
   single column this slide uses and its rule is centred with it. */
#slide-supporters .chapter-base {
  margin-top: 1.6rem;
  font-size: clamp(.82rem, 1vw, .94rem);
  opacity: .8;
}

#slide-supporters .chapter-definition {
  grid-column: 1;
  max-width: 44ch;
  margin-top: 1rem;
  padding-top: .9rem;
  font-size: clamp(.82rem, 1vw, .94rem);
  opacity: .8;
}

/* The foreword is one continuous signed piece, so it is set as prose rather
   than as the narrative component's default grid of numbered cards. Four
   cards side by side would break a single argument into four boxes and the
   card numbers would read as an enumeration the author did not write.
   Two balanced columns, read down and then across, as a printed foreword is
   set. This keeps the four paragraphs in their written order, halves the
   height a single column would need, and holds the line length at a readable
   measure. No paragraph is allowed to break across the column boundary.
   Below 900px it becomes one column in the same order. */
#slide-foreword .narrative-grid {
  display: block;
  column-count: 2;
  column-gap: clamp(2rem, 4vw, 3.5rem);
}

@media (max-width: 900px) {
  #slide-foreword .narrative-grid {
    column-count: 1;
  }
}

#slide-foreword .narrative-point {
  min-height: 0;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: none;
  break-inside: avoid;
}

#slide-foreword .narrative-point + .narrative-point {
  margin-top: 1.05rem;
}

#slide-foreword .narrative-point > p:last-child {
  font-size: clamp(.98rem, 1.15vw, 1.06rem);
  line-height: 1.5;
}

#slide-foreword .narrative-point__number {
  display: none;
}

/* The byline carries the author's name and role, so it is set apart from the
   standfirst styling the lede slot normally gets. */
#slide-foreword .slide-head .lede {
  max-width: 68ch;
  font-weight: 600;
  color: var(--purple);
}

/* The author's portrait beside the heading. The narrative kind has no image
   field, so the stylesheet draws it; the photo is decorative because his name
   and role are already in the byline text. Framed as the kit's own people
   cards are: soft backdrop behind the cut-out, white rim, purple ring. */
#slide-foreword .slide-head {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  column-gap: clamp(1.25rem, 3vw, 2.5rem);
  align-items: center;
}

#slide-foreword .slide-head > * {
  grid-column: 1;
}

#slide-foreword .slide-head::after {
  content: "";
  grid-column: 2;
  grid-row: 1 / span 3;
  width: clamp(88px, 11vw, 150px);
  aspect-ratio: 1;
  border-radius: 50%;
  background: url("assets/jason-wescott.png") center / cover no-repeat var(--soft);
  border: 4px solid var(--white);
  box-shadow: 0 0 0 3px var(--purple);
}

/* On a phone the portrait sits beside the eyebrow and title only, so the
   byline keeps the full width rather than wrapping into a narrow column. */
@media (max-width: 600px) {
  #slide-foreword .slide-head > .lede {
    grid-column: 1 / -1;
  }

  #slide-foreword .slide-head::after {
    grid-row: 1 / span 2;
    width: 76px;
  }
}

/* ------------------------------------------------------------------------- */
/* v5.7: the deck's own paragraph breaks.                                     */
/*                                                                            */
/* Eight pages ran two or three separate deck passages together as one block   */
/* of text. A string field renders as a single paragraph and carries no inline */
/* markup, so the only shape the kit gives a text slot more than one paragraph */
/* is the 1.9.0 list, {lead, bullets}. Each passage is now its own item.       */
/*                                                                            */
/* "What this means for you" keeps its markers, because deck slide 50 prints   */
/* bullets there. On the other seven the deck prints plain paragraphs, so the  */
/* marker and the indent come off, scoped by slide id, and the items read as   */
/* the paragraphs they are.                                                    */
/* ------------------------------------------------------------------------- */
#slide-sell-side-profile .takeaway.rich-list ul,
#slide-sell-side-drivers-and-barriers .takeaway.rich-list ul,
#slide-attribution-models .takeaway.rich-list ul,
#slide-mena-profile-comparison .takeaway.rich-list ul {
  list-style: none;
  padding-left: 0;
}

/* The gap between them is the kit's own paragraph margin of 1em rather than the
   .45em this theme gives a bulleted item, so two captions read as two paragraphs
   instead of as one wrapped line. The portfolio and investment slides moved to the
   inline model in v5.8, because the deck splits two of their captions mid-sentence. */
#slide-sell-side-profile .takeaway.rich-list li + li,
#slide-sell-side-drivers-and-barriers .takeaway.rich-list li + li {
  margin-top: 1em;
}

/* Deck slide 36 sets its analysis as two boxes, each a bold heading over its own
   paragraph. The takeaway is the only field on this slide kind that holds more than
   one paragraph, so it carries all four. The component's own bold navy is already
   the heading treatment and the lead line takes it as it stands; the second heading
   keeps it; and the two paragraphs are set in body weight beneath their headings, at
   the same size, which is the only difference the deck draws between them. */
#slide-attribution-models .takeaway.rich-list > p {
  margin-bottom: .45em;
}

#slide-attribution-models .takeaway.rich-list li:nth-child(2) {
  margin-top: 1.2em;
}

#slide-attribution-models .takeaway.rich-list li:nth-child(1),
#slide-attribution-models .takeaway.rich-list li:nth-child(3) {
  margin-top: .45em;
  color: var(--ink);
  font-weight: 400;
}

/* Deck slide 46 runs a heading over three paragraphs in a panel beside the table, a
   labelled base note under the table and the source line at the foot. The matrix
   component renders a header, the table panel and the takeaway, and nothing else: it
   has no note slot, and a subtitle is one string that cannot hold a heading and three
   paragraphs. All seven blocks are therefore carried in the takeaway and set out here.
   The emphasis frame comes off, because six of the seven are not conclusions. */
#slide-mena-profile-comparison > .slide-inner > .takeaway {
  max-width: none;
  padding-left: 0;
  border-left: 0;
}

#slide-mena-profile-comparison .takeaway.rich-list > p {
  margin-bottom: .75em;
  font-size: 1.06em;
}

#slide-mena-profile-comparison .takeaway.rich-list li {
  margin-top: 1em;
  font-size: .94em;
  font-weight: 400;
}

/* The base note keeps the label the deck gives it, and the note beneath it takes the
   quieter setting the deck prints it in. */
#slide-mena-profile-comparison .takeaway.rich-list li:nth-child(4) {
  margin-top: 1.9em;
  font-weight: 700;
}

#slide-mena-profile-comparison .takeaway.rich-list li:nth-child(5) {
  margin-top: .45em;
  color: var(--muted);
  font-size: .86em;
  line-height: 1.55;
}

/* The source line is this slide's note. The component renders no note, so it is set
   here as the small muted line every other slide carries at its foot. */
#slide-mena-profile-comparison .takeaway.rich-list li:nth-child(6) {
  margin-top: 1.5em;
  color: var(--muted);
  font-size: .8em;
  line-height: 1.45;
}

/* ------------------------------------------------------------------------- */
/* v5.8: inline emphasis, and the deck's own weights.                         */
/*                                                                            */
/* The kit escapes markup, so a run inside a sentence cannot be tagged in the  */
/* content. What a list can do is carry each run as its own item. Setting      */
/* those items display:inline flows them back into a single paragraph, and the */
/* emphasised item alone takes the deck's pink or its bold. The space between  */
/* two runs is generated by the stylesheet rather than typed into the source,  */
/* so no string carries trailing whitespace and no space can be lost or        */
/* doubled. An item that is a paragraph in its own right is set display:block  */
/* instead; a block item, and the inline run that follows it, each take their  */
/* own line.                                                                   */
/*                                                                            */
/* Every run was read out of the deck's own XML run properties, bold flag and  */
/* colour, and checked against the slide image. Each rule is scoped by slide   */
/* id. accent4 and DE4AC7 are the deck's pink, 21325E its navy.                */
/* ------------------------------------------------------------------------- */

/* The inline run. */
#slide-five-themes .qualitative-card .rich-list ul,
#slide-method-and-sample .chart-narrative__text > .rich-list:nth-child(2) ul,
#slide-who-responded-2026 .takeaway.rich-list ul,
#slide-shift-to-longer-term-partnerships .chart-narrative__text .rich-list ul,
#slide-portfolio-and-coverage .takeaway.rich-list ul,
#slide-investment-satisfaction-and-share .takeaway.rich-list ul,
#slide-maturity-and-frameworks .takeaway.rich-list ul,
#slide-reallocated-or-new .takeaway.rich-list ul,
#slide-buyer-structure-and-trend .takeaway.rich-list ul,
#slide-on-site-demand-and-supply .takeaway.rich-list ul,
#slide-off-site-demand-and-supply .takeaway.rich-list ul,
#slide-in-store-demand-and-supply .takeaway.rich-list ul,
#slide-opportunity-moving-to-data .chart-narrative__text .rich-list ul,
#slide-reason-to-invest .takeaway.rich-list ul,
#slide-shelf-space-to-data-asset .takeaway.rich-list ul,
#slide-barriers-intensifying .chart-narrative__text .rich-list ul,
#slide-barrier-landscape-2026 .takeaway.rich-list ul,
#slide-sellers-narrowed-growth-expectations .chart-narrative__text .rich-list ul,
#slide-measurement-gap .takeaway.rich-list ul,
#slide-how-buyers-judge-a-network .takeaway.rich-list ul,
#slide-indicative-attitudinal-signals .takeaway.rich-list ul {
  margin: 0;
  padding-left: 0;
  list-style: none;
}

#slide-five-themes .qualitative-card .rich-list li,
#slide-method-and-sample .chart-narrative__text > .rich-list:nth-child(2) li,
#slide-who-responded-2026 .takeaway.rich-list li,
#slide-shift-to-longer-term-partnerships .chart-narrative__text .rich-list li,
#slide-portfolio-and-coverage .takeaway.rich-list li,
#slide-investment-satisfaction-and-share .takeaway.rich-list li,
#slide-reallocated-or-new .takeaway.rich-list li,
#slide-buyer-structure-and-trend .takeaway.rich-list li,
#slide-on-site-demand-and-supply .takeaway.rich-list li,
#slide-off-site-demand-and-supply .takeaway.rich-list li,
#slide-in-store-demand-and-supply .takeaway.rich-list li,
#slide-opportunity-moving-to-data .chart-narrative__text .rich-list li,
#slide-reason-to-invest .takeaway.rich-list li,
#slide-shelf-space-to-data-asset .takeaway.rich-list li,
#slide-barriers-intensifying .chart-narrative__text .rich-list li,
#slide-barrier-landscape-2026 .takeaway.rich-list li,
#slide-sellers-narrowed-growth-expectations .chart-narrative__text .rich-list li,
#slide-measurement-gap .takeaway.rich-list li,
#slide-how-buyers-judge-a-network .takeaway.rich-list li,
#slide-indicative-attitudinal-signals .takeaway.rich-list li {
  display: inline;
  margin: 0;
}

/* One generated space between consecutive runs, which is also where the line is
   allowed to break. Nothing in the source string ends or begins on a space.
   `white-space: pre-wrap` is a guard rather than a fix, and the difference was
   measured rather than assumed: forced back to `normal` the gap is still one space
   on Chrome 156, so the generated space survives there on its own. It is kept
   because generated content that is nothing but a space is the kind of thing an
   engine may collapse, and pre-wrap preserves it while still allowing the line to
   break at it, which `pre` and a non-breaking space would both prevent. */
#slide-five-themes .qualitative-card .rich-list li + li::before,
#slide-method-and-sample .chart-narrative__text > .rich-list:nth-child(2) li + li::before,
#slide-who-responded-2026 .takeaway.rich-list li + li::before,
#slide-shift-to-longer-term-partnerships .chart-narrative__text .rich-list li + li::before,
#slide-portfolio-and-coverage .takeaway.rich-list li + li::before,
#slide-investment-satisfaction-and-share .takeaway.rich-list li + li::before,
#slide-reallocated-or-new .takeaway.rich-list li + li::before,
#slide-buyer-structure-and-trend .takeaway.rich-list li + li::before,
#slide-on-site-demand-and-supply .takeaway.rich-list li + li::before,
#slide-off-site-demand-and-supply .takeaway.rich-list li + li::before,
#slide-in-store-demand-and-supply .takeaway.rich-list li + li::before,
#slide-opportunity-moving-to-data .chart-narrative__text .rich-list li + li::before,
#slide-reason-to-invest .takeaway.rich-list li + li::before,
#slide-shelf-space-to-data-asset .takeaway.rich-list li + li::before,
#slide-barriers-intensifying .chart-narrative__text .rich-list li + li::before,
#slide-barrier-landscape-2026 .takeaway.rich-list li + li::before,
#slide-sellers-narrowed-growth-expectations .chart-narrative__text .rich-list li + li::before,
#slide-measurement-gap .takeaway.rich-list li + li::before,
#slide-how-buyers-judge-a-network .takeaway.rich-list li + li::before,
#slide-indicative-attitudinal-signals .takeaway.rich-list li + li::before {
  content: " ";
  white-space: pre-wrap;
}

/* A run that is a paragraph in its own right. Margins collapse between two of
   these, so consecutive paragraphs keep one gap rather than two, and a bottom
   margin is what spaces an inline run that follows one. */
#slide-investment-satisfaction-and-share .takeaway.rich-list li:nth-child(1),
#slide-investment-satisfaction-and-share .takeaway.rich-list li:nth-child(2),
#slide-portfolio-and-coverage .takeaway.rich-list li:nth-child(3),
#slide-maturity-and-frameworks .takeaway.rich-list li,
#slide-reallocated-or-new .takeaway.rich-list li:nth-child(1),
#slide-reallocated-or-new .takeaway.rich-list li:nth-child(2),
#slide-reallocated-or-new .takeaway.rich-list li:nth-child(3),
#slide-reallocated-or-new .takeaway.rich-list li:nth-child(6),
#slide-buyer-structure-and-trend .takeaway.rich-list li:nth-child(1),
#slide-buyer-structure-and-trend .takeaway.rich-list li:nth-child(2),
#slide-buyer-structure-and-trend .takeaway.rich-list li:nth-child(5),
#slide-on-site-demand-and-supply .takeaway.rich-list li,
#slide-off-site-demand-and-supply .takeaway.rich-list li:nth-child(4),
#slide-in-store-demand-and-supply .takeaway.rich-list li,
#slide-shelf-space-to-data-asset .takeaway.rich-list li:nth-child(1),
#slide-measurement-gap .takeaway.rich-list li:nth-child(4) {
  display: block;
  margin: 1em 0;
}

#slide-investment-satisfaction-and-share .takeaway.rich-list li:first-child,
#slide-maturity-and-frameworks .takeaway.rich-list li:first-child,
#slide-reallocated-or-new .takeaway.rich-list li:first-child,
#slide-buyer-structure-and-trend .takeaway.rich-list li:first-child,
#slide-on-site-demand-and-supply .takeaway.rich-list li:first-child,
#slide-in-store-demand-and-supply .takeaway.rich-list li:first-child,
#slide-shelf-space-to-data-asset .takeaway.rich-list li:first-child {
  margin-top: 0;
}

/* A run that opens a paragraph takes no joining space. Under pre-wrap a leading space
   is preserved rather than collapsed, and it showed on the rendered page as a one-space
   indent in front of the channels paragraph on the funded-by-brand slide. Every run
   that opens a paragraph is listed, whether it is a block of its own or the first
   inline run of a new one. */
#slide-investment-satisfaction-and-share .takeaway.rich-list li:nth-child(2)::before,
#slide-investment-satisfaction-and-share .takeaway.rich-list li:nth-child(3)::before,
#slide-investment-satisfaction-and-share .takeaway.rich-list li:nth-child(4)::before,
#slide-portfolio-and-coverage .takeaway.rich-list li:nth-child(3)::before,
#slide-reallocated-or-new .takeaway.rich-list li:nth-child(2)::before,
#slide-reallocated-or-new .takeaway.rich-list li:nth-child(3)::before,
#slide-reallocated-or-new .takeaway.rich-list li:nth-child(4)::before,
#slide-reallocated-or-new .takeaway.rich-list li:nth-child(6)::before,
#slide-buyer-structure-and-trend .takeaway.rich-list li:nth-child(2)::before,
#slide-buyer-structure-and-trend .takeaway.rich-list li:nth-child(3)::before,
#slide-buyer-structure-and-trend .takeaway.rich-list li:nth-child(5)::before,
#slide-on-site-demand-and-supply .takeaway.rich-list li::before,
#slide-off-site-demand-and-supply .takeaway.rich-list li:nth-child(4)::before,
#slide-in-store-demand-and-supply .takeaway.rich-list li::before,
#slide-shelf-space-to-data-asset .takeaway.rich-list li:nth-child(2)::before,
#slide-measurement-gap .takeaway.rich-list li:nth-child(4)::before {
  content: none;
}

/* p6, deck 5. Themes 01 and 04 close on a pink sentence, in line. */
#slide-five-themes .qualitative-card .rich-list li:nth-child(2) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* p8, deck 6. The Ascentinel clause is a bold navy run-in; the rest is plain. */
#slide-method-and-sample .chart-narrative__text > .rich-list:nth-child(2) li:nth-child(1) {
  color: var(--navy);
  font-weight: 700;
}

/* p9, deck 7. "The sell-side sample is significantly more experienced:" is pink bold. */
#slide-who-responded-2026 .takeaway.rich-list li:nth-child(1) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* p12, deck 10. The pink sentence closes the paragraph, in line. */
#slide-shift-to-longer-term-partnerships .chart-narrative__text .rich-list li:nth-child(2) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* p16, deck 13. Caption 1 is pink to "...four or more networks" and plain after it;
   caption 2 is pink whole and is its own paragraph under its own chart. */
#slide-portfolio-and-coverage .takeaway.rich-list li:nth-child(1),
#slide-portfolio-and-coverage .takeaway.rich-list li:nth-child(3) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* p18, deck 15. Captions 1 and 2 are pink whole; caption 3 is pink to "...for most
   buyers" and plain from the comma on. The comma belongs to the plain run in the deck,
   so it leads that run and takes no joining space in front of it, which is why run 4 is
   listed with the paragraph openers above. */
#slide-investment-satisfaction-and-share .takeaway.rich-list li:nth-child(1),
#slide-investment-satisfaction-and-share .takeaway.rich-list li:nth-child(2),
#slide-investment-satisfaction-and-share .takeaway.rich-list li:nth-child(3) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* Deck 16. The pink stops on the comma after "...they are not getting,", which is where
   the deck stops it, and the channels sentence is the second paragraph under "Why it
   matters" rather than a third heading the deck does not have. */
#slide-reallocated-or-new .takeaway.rich-list li:nth-child(4) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* Deck 18. One heading over two paragraphs and the NB, with the pink closing the
   second paragraph in line. */
#slide-buyer-structure-and-trend .takeaway.rich-list li:nth-child(4) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* The three merged slides set their deck headings as headings: block runs in the navy
   and the weight the deck gives them, with the paragraph close underneath. This is the
   treatment the through-line heading already takes on the implications slide. */
#slide-maturity-and-frameworks .takeaway.rich-list li:nth-child(1),
#slide-maturity-and-frameworks .takeaway.rich-list li:nth-child(4),
#slide-reallocated-or-new .takeaway.rich-list li:nth-child(1),
#slide-reallocated-or-new .takeaway.rich-list li:nth-child(3),
#slide-buyer-structure-and-trend .takeaway.rich-list li:nth-child(1) {
  margin-bottom: .4em;
  color: var(--navy);
  font-weight: 700;
}

/* p25, deck 20. The CTV sentence is pink inside the paragraph. */
#slide-off-site-demand-and-supply .takeaway.rich-list li:nth-child(2) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* p28, deck 23. "In other words," is plain and the rest of the paragraph is pink. */
#slide-opportunity-moving-to-data .chart-narrative__text .rich-list li:nth-child(2) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* p30, deck 25. The opening clause is pink bold, the rest plain. */
#slide-reason-to-invest .takeaway.rich-list li:nth-child(1) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* p31, deck 26. "The through-line" is a heading on its own line, and the middle
   sentence of the paragraph beneath it is pink. */
#slide-shelf-space-to-data-asset .takeaway.rich-list li:nth-child(1) {
  margin-bottom: .4em;
  color: var(--navy);
  font-weight: 700;
}

#slide-shelf-space-to-data-asset .takeaway.rich-list li:nth-child(3) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* p32, deck 27, and p36, deck 31. The pink sentence closes the paragraph, in line. */
#slide-barriers-intensifying .chart-narrative__text .rich-list li:nth-child(2),
#slide-sellers-narrowed-growth-expectations .chart-narrative__text .rich-list li:nth-child(2) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* p33, deck 28. The deck colours the FIRST two sentences and leaves "A narrower brief
   than 'standardisation' alone suggests." plain, which is the opposite of the way the
   run-difference reader prints it; read off the slide image. */
#slide-barrier-landscape-2026 .takeaway.rich-list li:nth-child(1) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* p39, deck 34. The opening sentence takes the darker body ink the deck gives it, the
   middle is the muted body, and the closing sentence is pink. The deck does not bold
   the opening sentence, so neither does this. */
#slide-measurement-gap .takeaway.rich-list li:nth-child(1) {
  color: var(--navy);
}

#slide-measurement-gap .takeaway.rich-list li:nth-child(3) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* p45, deck 40. The closing sentence is pink. */
#slide-how-buyers-judge-a-network .takeaway.rich-list li:nth-child(2) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* p52, deck 47. Here the deck colours the opening sentence and leaves the rest plain. */
#slide-indicative-attitudinal-signals .takeaway.rich-list li:nth-child(1) {
  color: var(--deck-pink);
  font-weight: 700;
}

/* The deck prints each NB directly beneath the analysis it qualifies, small and quiet,
   and keeps the slide's footnote for the source line alone. This is the same setting
   the NB paragraphs on the growth and AI slides already take. */
#slide-buyer-structure-and-trend .takeaway.rich-list li:nth-child(5),
#slide-on-site-demand-and-supply .takeaway.rich-list li:nth-child(2),
#slide-off-site-demand-and-supply .takeaway.rich-list li:nth-child(4),
#slide-in-store-demand-and-supply .takeaway.rich-list li:nth-child(2),
#slide-measurement-gap .takeaway.rich-list li:nth-child(4) {
  margin-bottom: 0;
  color: var(--muted);
  font-size: .86em;
  font-weight: 400;
  line-height: 1.5;
}

/* Where a takeaway carries the deck's plain body text it reads as body text. The
   component sets every takeaway navy and 700, which made whole passages the deck
   prints plain look like conclusions. Only the runs above are bold or pink now.
   The four statements Anita asked to have on the face keep their bold pink and are
   deliberately not in this list. */
#slide-who-responded-2026 > .slide-inner > .takeaway,
#slide-maturity-and-frameworks > .slide-inner > .takeaway,
#slide-portfolio-and-coverage > .slide-inner > .takeaway,
#slide-reallocated-or-new > .slide-inner > .takeaway,
#slide-buyer-structure-and-trend > .slide-inner > .takeaway,
#slide-sell-side-profile > .slide-inner > .takeaway,
#slide-investment-satisfaction-and-share > .slide-inner > .takeaway,
#slide-on-site-demand-and-supply > .slide-inner > .takeaway,
#slide-off-site-demand-and-supply > .slide-inner > .takeaway,
#slide-in-store-demand-and-supply > .slide-inner > .takeaway,
#slide-reason-to-invest > .slide-inner > .takeaway,
#slide-shelf-space-to-data-asset > .slide-inner > .takeaway,
#slide-barrier-landscape-2026 > .slide-inner > .takeaway,
#slide-sell-side-drivers-and-barriers > .slide-inner > .takeaway,
#slide-measurement-gap > .slide-inner > .takeaway,
#slide-how-buyers-judge-a-network > .slide-inner > .takeaway,
#slide-indicative-attitudinal-signals > .slide-inner > .takeaway {
  color: var(--ink);
  font-weight: 400;
}

/* p45, deck 40. The deck prints the speaker beneath the quotation, on its own line.
   The only field above the chart on this slide kind is the subtitle, which is a
   single string and cannot break, so the attribution is set here, in the deck's
   position and treatment. Same device, and the same cost, as the two right-column
   labels above: a check that reads content.json cannot see it. */
#slide-how-buyers-judge-a-network .slide-head .lede::after {
  content: "Buy-side, advertiser";
  display: block;
  margin-top: .55rem;
  color: var(--navy);
  font-size: .86em;
  font-weight: 700;
}

/* ------------------------------------------------------------------------- */
/* Chart colours.                                                            */
/*                                                                           */
/* A chart carrying more than one series takes one colour per series, read    */
/* from the deck's own series fills and matched on the series name. Matching  */
/* by name rather than by position is what makes the reversed series order on */
/* the horizontal charts a non-issue, and the rule colours the legend swatch  */
/* and the bars together because both read --series-color.                    */
/*                                                                           */
/* A chart carrying one series follows one of two rules, and which one is     */
/* decided by the deck.                                                      */
/*                                                                           */
/* The 20 highlight charts keep the deck's own colours exactly: one or more   */
/* values picked out in pink against a uniform base, and where the deck has   */
/* one, the non-substantive answer ("Don't know", "Not sure", "N/A",          */
/* "Other") in lavender. That encoding carries meaning, so it is reproduced   */
/* rather than replaced.                                                      */
/*                                                                           */
/* Every other chart carrying one series, and both doughnuts, is coloured by  */
/* rank, in the sequence deck slide 10 uses: rank 1 brand purple, rank 2      */
/* brand sky, rank 3 brand lavender, and every rank below 3 navy. The top     */
/* three are what a reader can tell apart, so the sequence stops there and    */
/* the tail reads as one group. Tied values share a colour, except on a       */
/* doughnut, where tied slices sit against each other and a shared colour     */
/* would merge them into one arc, so there ties take consecutive ranks.       */
/*                                                                           */
/* Positions below are the report's own reading order, which on horizontal    */
/* bars is the reverse of the deck's cached category order. That flip is      */
/* measured against each deck chart rather than assumed, and the comment on   */
/* each block records which deck chart it came from.                          */
/*                                                                           */
/* Generated by team-work/_staging/attitudes-kit/gen-colours.js from the      */
/* corrected deck and content.json. Edit the generator, not this block.       */
/* ------------------------------------------------------------------------- */

/* One palette for both rules. The highlight charts use these five by the role the
   deck gives them; the rank-coloured charts use the same tokens as a sequence,
   rank 1 purple, rank 2 sky, rank 3 lavender and every rank below 3 navy, which is
   deck slide 10's own sequence read by rank. Dark mode substitutes a counterpart of
   the same role, because the deck has no dark mode and navy is 1.5:1 on dark paper. */
:root {
  --deck-purple: #6d1afe;
  --deck-navy: #21325e;
  --deck-sky: #74deff;
  --deck-pink: #de4ac7;
  --deck-lavender: #8e94fe;
}

@media screen {
  :root[data-report-dark="true"] {
    --deck-purple: #b99cff;
    --deck-navy: #c0c6d5;
    --deck-sky: #75deff;
    --deck-pink: #f083da;
    --deck-lavender: #aeb2ff;
  }
}

/* method-and-sample - Cleaned respondents by wave - one colour per series, deck chart1.xml */
#slide-method-and-sample .series-0 { --series-color: var(--deck-purple); }
#slide-method-and-sample .series-1 { --series-color: var(--deck-sky); }

/* who-responded-2026 - Buy-side and sell-side share of the 2026 sample - by rank, ties take consecutive ranks */
#slide-who-responded-2026 .visual-grid > .panel:nth-child(1) .series-0 { --series-color: var(--deck-purple); }
#slide-who-responded-2026 .visual-grid > .panel:nth-child(1) .series-1 { --series-color: var(--deck-sky); }

/* who-responded-2026 - Regions respondents are responsible for (Q1b) - deck colours, chart3.xml, deck order reversed */
#slide-who-responded-2026 .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(1) .comparison-value,
#slide-who-responded-2026 .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(3) .comparison-value,
#slide-who-responded-2026 .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(4) .comparison-value,
#slide-who-responded-2026 .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(5) .comparison-value { --series-color: var(--deck-navy); }
#slide-who-responded-2026 .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(2) .comparison-value { --series-color: var(--deck-pink); }

/* who-responded-2026 - Years in online advertising (QD1) - one colour per series, deck chart4.xml */
#slide-who-responded-2026 .visual-grid > .panel:nth-child(3) .series-0 { --series-color: var(--deck-sky); }
#slide-who-responded-2026 .visual-grid > .panel:nth-child(3) .series-1 { --series-color: var(--deck-purple); }

/* shift-to-longer-term-partnerships - European buyers partnering with retailers for more than one year - by rank, deck chart5.xml */
#slide-shift-to-longer-term-partnerships .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-lavender); }
#slide-shift-to-longer-term-partnerships .comparison-group:nth-child(2) .comparison-value { --series-color: var(--deck-sky); }
#slide-shift-to-longer-term-partnerships .comparison-group:nth-child(3) .comparison-value { --series-color: var(--deck-purple); }

/* maturity-and-frameworks - Self-assessed maturity of Retail Media strategy (Q21, n=42) - deck colours, chart6.xml, deck order reversed */
#slide-maturity-and-frameworks .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(1) .comparison-value,
#slide-maturity-and-frameworks .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(2) .comparison-value,
#slide-maturity-and-frameworks .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(4) .comparison-value,
#slide-maturity-and-frameworks .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(5) .comparison-value { --series-color: var(--deck-purple); }
#slide-maturity-and-frameworks .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(3) .comparison-value { --series-color: var(--deck-pink); }

/* maturity-and-frameworks - Have frameworks or evaluation metrics for partnerships (Q22, n=42) - deck colours, chart7.xml, deck order reversed */
#slide-maturity-and-frameworks .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-pink); }
#slide-maturity-and-frameworks .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(2) .comparison-value { --series-color: var(--deck-navy); }
#slide-maturity-and-frameworks .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(3) .comparison-value { --series-color: var(--deck-lavender); }

/* portfolio-and-coverage - Number of Retail Media networks buyers work with - deck colours, chart8.xml, deck order reversed */
#slide-portfolio-and-coverage .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(1) .comparison-value,
#slide-portfolio-and-coverage .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(2) .comparison-value,
#slide-portfolio-and-coverage .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(4) .comparison-value,
#slide-portfolio-and-coverage .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(5) .comparison-value { --series-color: var(--deck-purple); }
#slide-portfolio-and-coverage .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(3) .comparison-value { --series-color: var(--deck-pink); }
#slide-portfolio-and-coverage .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(6) .comparison-value { --series-color: var(--deck-lavender); }

/* portfolio-and-coverage - What the sell-side offer covers - deck colours, chart9.xml, deck order reversed */
#slide-portfolio-and-coverage .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-pink); }
#slide-portfolio-and-coverage .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(2) .comparison-value,
#slide-portfolio-and-coverage .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(3) .comparison-value,
#slide-portfolio-and-coverage .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(4) .comparison-value { --series-color: var(--deck-sky); }

/* sell-side-profile - Retail category (S-Q3a, n=58) - deck colours, chart10.xml, deck order reversed */
#slide-sell-side-profile .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-pink); }
#slide-sell-side-profile .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(2) .comparison-value,
#slide-sell-side-profile .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(3) .comparison-value,
#slide-sell-side-profile .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(4) .comparison-value,
#slide-sell-side-profile .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(5) .comparison-value,
#slide-sell-side-profile .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(6) .comparison-value { --series-color: var(--deck-purple); }

/* sell-side-profile - Pricing model (S-Q6, n=59) - deck colours, chart11.xml, deck order reversed */
#slide-sell-side-profile .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-pink); }
#slide-sell-side-profile .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(2) .comparison-value,
#slide-sell-side-profile .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(3) .comparison-value,
#slide-sell-side-profile .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(4) .comparison-value { --series-color: var(--deck-sky); }
#slide-sell-side-profile .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(5) .comparison-value { --series-color: var(--deck-lavender); }

/* sell-side-profile - Internal structure (S-Q13, n=40) - deck colours, chart12.xml, deck order reversed */
#slide-sell-side-profile .visual-grid > .panel:nth-child(3) .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-pink); }
#slide-sell-side-profile .visual-grid > .panel:nth-child(3) .comparison-group:nth-child(2) .comparison-value,
#slide-sell-side-profile .visual-grid > .panel:nth-child(3) .comparison-group:nth-child(3) .comparison-value,
#slide-sell-side-profile .visual-grid > .panel:nth-child(3) .comparison-group:nth-child(4) .comparison-value,
#slide-sell-side-profile .visual-grid > .panel:nth-child(3) .comparison-group:nth-child(5) .comparison-value { --series-color: var(--deck-navy); }

/* investment-satisfaction-and-share - Retail Media investment over the past 12 months - deck colours, chart13.xml, deck order reversed */
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-pink); }
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(2) .comparison-value,
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(3) .comparison-value { --series-color: var(--deck-purple); }
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(4) .comparison-value { --series-color: var(--deck-lavender); }

/* investment-satisfaction-and-share - Satisfaction versus other media investments - deck colours, chart14.xml, deck order reversed */
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-pink); }
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(2) .comparison-value,
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(3) .comparison-value { --series-color: var(--deck-navy); }
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(4) .comparison-value { --series-color: var(--deck-lavender); }

/* investment-satisfaction-and-share - Share of digital investment going to Retail Media - by rank, deck chart15.xml */
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(3) .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-purple); }
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(3) .comparison-group:nth-child(2) .comparison-value { --series-color: var(--deck-lavender); }
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(3) .comparison-group:nth-child(3) .comparison-value,
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(3) .comparison-group:nth-child(4) .comparison-value,
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(3) .comparison-group:nth-child(5) .comparison-value,
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(3) .comparison-group:nth-child(6) .comparison-value,
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(3) .comparison-group:nth-child(7) .comparison-value { --series-color: var(--deck-navy); }
#slide-investment-satisfaction-and-share .visual-grid > .panel:nth-child(3) .comparison-group:nth-child(8) .comparison-value { --series-color: var(--deck-sky); }

/* reallocated-or-new - Is Retail Media spend re-allocated or new? (Q17, n=51) - by rank, deck chart16.xml */
#slide-reallocated-or-new .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-purple); }
#slide-reallocated-or-new .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(2) .comparison-value { --series-color: var(--deck-sky); }
#slide-reallocated-or-new .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(3) .comparison-value { --series-color: var(--deck-lavender); }
#slide-reallocated-or-new .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(4) .comparison-value,
#slide-reallocated-or-new .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(5) .comparison-value { --series-color: var(--deck-navy); }

/* reallocated-or-new - Which budgets the money is shifted from (Q19, n=42) - deck colours, chart17.xml, deck order reversed */
#slide-reallocated-or-new .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-pink); }
#slide-reallocated-or-new .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(2) .comparison-value,
#slide-reallocated-or-new .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(3) .comparison-value,
#slide-reallocated-or-new .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(4) .comparison-value { --series-color: var(--deck-navy); }
#slide-reallocated-or-new .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(5) .comparison-value { --series-color: var(--deck-lavender); }

/* buyer-structure-and-trend - How buyers are structured to leverage Retail Media partnerships (Q20, all buyers, n=42, single choice) - deck colours, chart18.xml, deck order reversed */
#slide-buyer-structure-and-trend .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-pink); }
#slide-buyer-structure-and-trend .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(2) .comparison-value,
#slide-buyer-structure-and-trend .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(3) .comparison-value,
#slide-buyer-structure-and-trend .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(4) .comparison-value { --series-color: var(--deck-purple); }
#slide-buyer-structure-and-trend .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(5) .comparison-value { --series-color: var(--deck-lavender); }

/* buyer-structure-and-trend - Buy-side structure across three waves, European buyers - one colour per series, deck chart19.xml */
#slide-buyer-structure-and-trend .visual-grid > .panel:nth-child(2) .series-0 { --series-color: var(--deck-purple); }
#slide-buyer-structure-and-trend .visual-grid > .panel:nth-child(2) .series-1 { --series-color: var(--deck-sky); }
#slide-buyer-structure-and-trend .visual-grid > .panel:nth-child(2) .series-2 { --series-color: var(--deck-lavender); }

/* on-site-demand-and-supply - BUY-SIDE: on-site ads invested in - one colour for the whole panel, buy-side against sell-side */
#slide-on-site-demand-and-supply .visual-grid > .panel:nth-child(1) .comparison-value { --series-color: var(--deck-purple); }

/* on-site-demand-and-supply - SELL-SIDE: on-site ads offered - one colour for the whole panel, buy-side against sell-side */
#slide-on-site-demand-and-supply .visual-grid > .panel:nth-child(2) .comparison-value { --series-color: var(--deck-sky); }

/* off-site-demand-and-supply - BUY-SIDE: off-site channels invested in - one colour for the whole panel, buy-side against sell-side */
#slide-off-site-demand-and-supply .visual-grid > .panel:nth-child(1) .comparison-value { --series-color: var(--deck-purple); }

/* off-site-demand-and-supply - SELL-SIDE: off-site channels offered - one colour for the whole panel, buy-side against sell-side */
#slide-off-site-demand-and-supply .visual-grid > .panel:nth-child(2) .comparison-value { --series-color: var(--deck-sky); }

/* in-store-demand-and-supply - BUY-SIDE: in-store format invested in - one colour for the whole panel, buy-side against sell-side */
#slide-in-store-demand-and-supply .visual-grid > .panel:nth-child(1) .comparison-value { --series-color: var(--deck-purple); }

/* in-store-demand-and-supply - SELL-SIDE: in-store formats offered - one colour for the whole panel, buy-side against sell-side */
#slide-in-store-demand-and-supply .visual-grid > .panel:nth-child(2) .comparison-value { --series-color: var(--deck-sky); }

/* opportunity-moving-to-data - Opportunities named by European buyers across three waves - one colour per series, deck chart26.xml */
#slide-opportunity-moving-to-data .series-0 { --series-color: var(--deck-purple); }
#slide-opportunity-moving-to-data .series-1 { --series-color: var(--deck-sky); }
#slide-opportunity-moving-to-data .series-2 { --series-color: var(--deck-lavender); }

/* reason-to-invest - Opportunities Retail Media offers, all buyers - deck colours, chart27.xml, deck order reversed */
#slide-reason-to-invest .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-pink); }
#slide-reason-to-invest .comparison-group:nth-child(2) .comparison-value,
#slide-reason-to-invest .comparison-group:nth-child(3) .comparison-value,
#slide-reason-to-invest .comparison-group:nth-child(4) .comparison-value,
#slide-reason-to-invest .comparison-group:nth-child(5) .comparison-value,
#slide-reason-to-invest .comparison-group:nth-child(6) .comparison-value,
#slide-reason-to-invest .comparison-group:nth-child(7) .comparison-value,
#slide-reason-to-invest .comparison-group:nth-child(8) .comparison-value,
#slide-reason-to-invest .comparison-group:nth-child(9) .comparison-value,
#slide-reason-to-invest .comparison-group:nth-child(10) .comparison-value,
#slide-reason-to-invest .comparison-group:nth-child(11) .comparison-value { --series-color: var(--deck-purple); }

/* barriers-intensifying - Barriers named by European buyers across three waves - one colour per series, deck chart28.xml */
#slide-barriers-intensifying .series-0 { --series-color: var(--deck-purple); }
#slide-barriers-intensifying .series-1 { --series-color: var(--deck-sky); }
#slide-barriers-intensifying .series-2 { --series-color: var(--deck-lavender); }

/* barrier-landscape-2026 - Barriers to Retail Media investment (Q25, n=41) - deck colours, chart29.xml, deck order reversed */
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(1) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(2) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(3) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(4) .comparison-value { --series-color: var(--deck-pink); }
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(5) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(6) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(7) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(8) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(9) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(10) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(11) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(12) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(13) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(14) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(15) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(16) .comparison-value { --series-color: var(--deck-purple); }

/* barrier-landscape-2026 - Where standardisation is needed most (Q25a, n=33) - deck colours, chart30.xml, deck order reversed */
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(1) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(2) .comparison-value { --series-color: var(--deck-pink); }
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(3) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(4) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(5) .comparison-value,
#slide-barrier-landscape-2026 .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(6) .comparison-value { --series-color: var(--deck-navy); }

/* sell-side-drivers-and-barriers - Drivers for investing in a Retail Media proposition (S-Q16, n=36) - deck colours, chart31.xml, deck order reversed */
#slide-sell-side-drivers-and-barriers .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-pink); }
#slide-sell-side-drivers-and-barriers .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(2) .comparison-value,
#slide-sell-side-drivers-and-barriers .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(3) .comparison-value,
#slide-sell-side-drivers-and-barriers .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(4) .comparison-value,
#slide-sell-side-drivers-and-barriers .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(5) .comparison-value,
#slide-sell-side-drivers-and-barriers .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(6) .comparison-value,
#slide-sell-side-drivers-and-barriers .visual-grid > .panel:nth-child(1) .comparison-group:nth-child(7) .comparison-value { --series-color: var(--deck-purple); }

/* sell-side-drivers-and-barriers - Barriers to investing (S-Q17, n=35) - deck colours, chart32.xml, deck order reversed */
#slide-sell-side-drivers-and-barriers .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-pink); }
#slide-sell-side-drivers-and-barriers .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(2) .comparison-value,
#slide-sell-side-drivers-and-barriers .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(3) .comparison-value,
#slide-sell-side-drivers-and-barriers .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(4) .comparison-value,
#slide-sell-side-drivers-and-barriers .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(5) .comparison-value,
#slide-sell-side-drivers-and-barriers .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(6) .comparison-value,
#slide-sell-side-drivers-and-barriers .visual-grid > .panel:nth-child(2) .comparison-group:nth-child(7) .comparison-value { --series-color: var(--deck-sky); }

/* sellers-narrowed-growth-expectations - SELL-SIDE: growth areas - one colour per series, deck chart33.xml */
#slide-sellers-narrowed-growth-expectations .series-0 { --series-color: var(--deck-sky); }
#slide-sellers-narrowed-growth-expectations .series-1 { --series-color: var(--deck-lavender); }

/* roas-dethroned - European buyers asking their networks for return on ad spend - by rank, deck chart34.xml */
#slide-roas-dethroned .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-sky); }
#slide-roas-dethroned .comparison-group:nth-child(2) .comparison-value { --series-color: var(--deck-purple); }
#slide-roas-dethroned .comparison-group:nth-child(3) .comparison-value { --series-color: var(--deck-lavender); }

/* measurement-gap - BUY-SIDE: metrics wanted - one colour for the whole panel, buy-side against sell-side */
#slide-measurement-gap .visual-grid > .panel:nth-child(1) .comparison-value { --series-color: var(--deck-purple); }

/* measurement-gap - SELL-SIDE: measurement offered - one colour for the whole panel, buy-side against sell-side */
#slide-measurement-gap .visual-grid > .panel:nth-child(2) .comparison-value { --series-color: var(--deck-sky); }

/* attribution-models - BUY-SIDE: model preferred - one colour for the whole panel, buy-side against sell-side */
#slide-attribution-models .visual-grid > .panel:nth-child(1) .comparison-value { --series-color: var(--deck-purple); }

/* attribution-models - SELL-SIDE: models offered - one colour for the whole panel, buy-side against sell-side */
#slide-attribution-models .visual-grid > .panel:nth-child(2) .comparison-value { --series-color: var(--deck-sky); }

/* buy-side-growth-agenda - BUY-SIDE: growth drivers - by rank, deck chart39.xml */
#slide-buy-side-growth-agenda .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-purple); }
#slide-buy-side-growth-agenda .comparison-group:nth-child(2) .comparison-value { --series-color: var(--deck-sky); }
#slide-buy-side-growth-agenda .comparison-group:nth-child(3) .comparison-value { --series-color: var(--deck-lavender); }
#slide-buy-side-growth-agenda .comparison-group:nth-child(4) .comparison-value,
#slide-buy-side-growth-agenda .comparison-group:nth-child(5) .comparison-value,
#slide-buy-side-growth-agenda .comparison-group:nth-child(6) .comparison-value,
#slide-buy-side-growth-agenda .comparison-group:nth-child(7) .comparison-value,
#slide-buy-side-growth-agenda .comparison-group:nth-child(8) .comparison-value,
#slide-buy-side-growth-agenda .comparison-group:nth-child(9) .comparison-value,
#slide-buy-side-growth-agenda .comparison-group:nth-child(10) .comparison-value,
#slide-buy-side-growth-agenda .comparison-group:nth-child(11) .comparison-value,
#slide-buy-side-growth-agenda .comparison-group:nth-child(12) .comparison-value { --series-color: var(--deck-navy); }

/* seller-development-priorities - Seller development priorities for the next 12 months - deck colours, chart40.xml, deck order reversed */
#slide-seller-development-priorities .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-pink); }
#slide-seller-development-priorities .comparison-group:nth-child(2) .comparison-value,
#slide-seller-development-priorities .comparison-group:nth-child(3) .comparison-value,
#slide-seller-development-priorities .comparison-group:nth-child(4) .comparison-value,
#slide-seller-development-priorities .comparison-group:nth-child(5) .comparison-value,
#slide-seller-development-priorities .comparison-group:nth-child(6) .comparison-value,
#slide-seller-development-priorities .comparison-group:nth-child(7) .comparison-value,
#slide-seller-development-priorities .comparison-group:nth-child(8) .comparison-value { --series-color: var(--deck-purple); }

/* how-buyers-judge-a-network - Criteria buyers use to judge a Retail Media network - deck colours, chart41.xml, deck order reversed */
#slide-how-buyers-judge-a-network .comparison-group:nth-child(1) .comparison-value,
#slide-how-buyers-judge-a-network .comparison-group:nth-child(2) .comparison-value { --series-color: var(--deck-pink); }
#slide-how-buyers-judge-a-network .comparison-group:nth-child(3) .comparison-value,
#slide-how-buyers-judge-a-network .comparison-group:nth-child(4) .comparison-value,
#slide-how-buyers-judge-a-network .comparison-group:nth-child(5) .comparison-value,
#slide-how-buyers-judge-a-network .comparison-group:nth-child(6) .comparison-value,
#slide-how-buyers-judge-a-network .comparison-group:nth-child(7) .comparison-value,
#slide-how-buyers-judge-a-network .comparison-group:nth-child(8) .comparison-value,
#slide-how-buyers-judge-a-network .comparison-group:nth-child(9) .comparison-value,
#slide-how-buyers-judge-a-network .comparison-group:nth-child(10) .comparison-value,
#slide-how-buyers-judge-a-network .comparison-group:nth-child(11) .comparison-value,
#slide-how-buyers-judge-a-network .comparison-group:nth-child(12) .comparison-value,
#slide-how-buyers-judge-a-network .comparison-group:nth-child(13) .comparison-value { --series-color: var(--deck-purple); }

/* sellers-are-building - AI capabilities sellers plan to develop in the next 12 months - deck colours, chart42.xml, deck order reversed */
#slide-sellers-are-building .comparison-group:nth-child(1) .comparison-value { --series-color: var(--deck-pink); }
#slide-sellers-are-building .comparison-group:nth-child(2) .comparison-value,
#slide-sellers-are-building .comparison-group:nth-child(3) .comparison-value { --series-color: var(--deck-purple); }
#slide-sellers-are-building .comparison-group:nth-child(4) .comparison-value { --series-color: var(--deck-lavender); }

/* buyers-picking-where-it-bites - The single AI area expected to drive the highest increase in investment - by rank, ties take consecutive ranks */
#slide-buyers-picking-where-it-bites .series-0 { --series-color: var(--deck-purple); }
#slide-buyers-picking-where-it-bites .series-1 { --series-color: var(--deck-sky); }
#slide-buyers-picking-where-it-bites .series-2 { --series-color: var(--deck-lavender); }

/* indicative-attitudinal-signals - Indicative attitudinal signals, Europe against MENA - one colour per series, deck chart44.xml */
#slide-indicative-attitudinal-signals .series-0 { --series-color: var(--deck-pink); }
#slide-indicative-attitudinal-signals .series-1 { --series-color: var(--deck-purple); }
