/* =============================================================================
 * AI eShop Optimizer — Discount & Marketplace Management (DMM)
 * Sits on top of aieo-admin-panel.css so the whole page inherits the Oxford
 * Metadata look. Only DMM-specific additions live here.
 * ========================================================================== */

/* --------------------------------------------------------------------------
 *  Subtab bar — pill buttons, matches the top-bar nav style.
 *  Accent color is variable-driven so the same DOM/CSS can render in the
 *  three brand colors used across the AIEO admin:
 *    • DMM (Storefront Manager) → pink/magenta (default, `#f11569`)
 *    • Analytics (Optimizer)    → brand blue (variant `--analytics`)
 *    • AI Chat                  → violet      (variant `--chat`)
 *  Pages that use the anchor-based in-page TOC variant add the
 *  `.aieo-dmm-subtab-bar--analytics` or `--chat` modifier on the wrapper.
 * -------------------------------------------------------------------------- */

/* THE PINNED STRIP IS ITS OWN BAR, and since 11.0.1 it sits BELOW the menu (see
   _stickytop.php for why). The menu closes the header off against the top bar;
   this reads as a persistent submenu hanging under it. Same white and the same
   resting shadow as .aieo-dmm-subtab-bar so they stay siblings.

   Spacing runs menu → 10px seam → pill → 10px → page. The seam is the menu bar's
   scoped margin-bottom below; the second 10px here is the gap to the page
   content, and it is on this card because this card is now the last thing in
   the header.

   BOTH GAPS ARE 10px, 2026-08-02. This was 20px below against the seam's 10px
   above, so the pill sat high in its own space and read as belonging to the
   menu rather than floating between menu and page. Operator asked for the two
   to match. Note the knock-on: the no-pins rule below had to come down to 10px
   in the same change, because header→content was previously a consistent 20px
   in BOTH states and dropping only this one would have made the page shift by
   10px the moment someone unpinned their last chip.

   IT IS AS WIDE AS ITS CHIPS, NOT AS WIDE AS THE PAGE. The chips are centred, so
   a full-width card left a broad band of empty white either side of them — most
   visibly beside the menu's own + and Ctrl+K controls directly below. Shrinking
   the card to its contents removes that band entirely.

   `width: fit-content` sizes it to the chips; the padding is the breathing room
   around them, and it is UNIFORM — the same 10px on all four sides, so the chips
   sit in an evenly weighted card rather than one that is generous either side
   and tight above and below. `max-width: 100%` caps it at the menu bar below, which is its sibling in
   the same rail — so with enough pinned it grows to the menu's width, the chips
   wrap, and `.aieo-dmm-pins`'s `flex: 1 1 100%` + `justify-content: center` keep
   the wrapped rows centred. `margin: 0 auto 10px` centres the card itself over
   the menu. box-sizing is stated rather than inherited because the 100% cap has
   to include that 40px padding, not add to it. */

/* NOTHING PINNED, NO BAR AT ALL. Hiding .aieo-dmm-pins alone would leave its
   wrapper behind as an empty white sliver, complete with padding and shadow —
   a bar about nothing, which is worse than the doubled gap it replaced. The
   whole card goes.

   :has() off the .is-empty flag welcome.php already toggles when the last pin
   is removed (its repaintPins), so there is one source of truth and the header
   corrects itself the moment a pin is added or removed, with no reload. On a
   browser without :has() the only consequence is that empty sliver. */

/* Measured, not guessed: 11px above the chips against 22px below. The extra
   11 is the menu bar's own 14px top padding, which sits between the chips and
   the menu text and is invisible in the markup. Trimmed to 4px INSIDE this
   wrapper only, so the bar keeps its normal padding anywhere else the class
   is used. (It was page-toc-bar.php that reused it; that partial had no
   callers and went in 11.0. The scoping stays: it costs nothing and the next
   reuse should not inherit a sticky header's spacing.)

   BOTTOM TOO, 2026-07-31. Only padding-top was overridden, so the three bands
   ran 10 / 10 / 14: the wrapper's 10px above the chips, this 10px between the
   chips and the menu, and then the bar's OWN `padding: 14px 20px` supplying
   14px below the menu. The bottom was the odd one out by exactly 4px, which
   is what the operator measured. Both numbers are set here now so the next
   person changing one cannot leave the other behind. Still scoped to the
   sticky wrapper: outside it the bar keeps its 14px. */

/* With no pill the menu is last and owns the gap to page content itself. It
   matches the pill's 10px rather than the base rule's 20px, so header→content
   is the same whether or not anything is pinned; otherwise the page jumped by
   10px when someone unpinned their last chip. Same .is-empty flag welcome.php
   toggles on pin/unpin, so this follows along live. */

/* Stuck: each card deepens its OWN shadow. The wrapper cannot carry it any
   more — a shadow on a transparent rail draws around the seam between the two
   cards as well as around the pair, which reads as a crack rather than a lift. */

/* (The wrapper's empty-state padding rule that used to live here is gone with
   the padding itself. Now that the strip has its own card, the empty case is
   handled by removing that card outright — see the :has() rule above.) */
/* The sentinel is a measuring device, never a visible thing. */

@media screen and (max-width: 782px) {
    /* WP admin bar 46px + ~76px top bar = 122px. */
    
}
/* The pills, and only the pills, wrap. `min-width: 0` because a flex item's
   default `min-width: auto` refuses to shrink below its content, which would
   push the tools off the right edge instead of wrapping a pill. */

/* The tools never wrap and never shrink: two icon buttons that must stay
   reachable at any width, vertically centred against the whole bar however
   many rows the pills take. */

@supports not (color: color-mix(in srgb, red 10%, #fff)) {
    /* Same reason as the hover fallback below: a flat neutral outline still
       makes the box legible, which is the whole job. */
    
}

@supports not (color: color-mix(in srgb, red 10%, transparent)) {
    /* Safari < 16.2 / older Firefox: fall back to the flat tint that shipped
       before per-group colour. Hover is decoration, so losing the tint is
       acceptable; losing legibility is not. */
    
}

/* --------------------------------------------------------------------------
 *  Per-group accent — "which section am I in?" at a glance.
 *
 *  Eleven top-level destinations shared one pink, so the bar read as a single
 *  undifferentiated strip and the only way to know where you were was to read
 *  the label. Each group now owns a hue, used by the nav pill AND by its card
 *  on the home page.
 *
 *  THE PALETTE IS DEFINED ONCE, HERE, on a bare [data-aieo-group] attribute
 *  rather than a nav-specific selector — the top bar and the home grid are two
 *  different DOM structures showing the same eleven groups, and a second copy
 *  of eleven hex values is a second copy to drift.
 *
 *  IT IS THE ROOSTER'S OWN PALETTE, taken from assets/icon.svg: tail green
 *  (#4C8309), body blue (#1E63CE), comb red (#D90B0E), beak amber (#FEAC03).
 *  An earlier pass used a generic magenta→violet→indigo rainbow; none of those
 *  hues are in the logo, and it hit red twice.
 *
 *  HUE = KIND, SHADE = MEMBER. Related groups share a hue and differ only in
 *  depth, so the three surfaces that answer "how is the business doing" —
 *  Customer Profiling, Performance, Insights — are visibly one family rather
 *  than three unrelated colours. The families are also CONTIGUOUS in menu
 *  order, so hue still tells you roughly where you are:
 *
 *      green  catalog & storefront   blue  people & results
 *      teal   demand                 warm  build & configure  → comb, then beak
 *
 *  Only four hues, because the logo only has four. Teal is the midpoint of the
 *  logo's own green and blue, not a fifth colour imported from outside.
 *
 *  CONTRAST IS NOT NEGOTIABLE. The active pill puts text on the accent, so
 *  every value clears 4.5:1 against white — AA for normal text, not just large
 *  — and shades within a family step 4.7 / 6.4 / 8.6 so they stay separable
 *  after the contrast floor is applied. The beak is the exception no amount of
 *  tuning fixes: a real amber is 1.89:1 against white. Darkening it until it
 *  passes turns it into a muddy gold that is no longer the logo colour, so that
 *  group alone flips its foreground to the logo's near-black (#212222) instead,
 *  measuring 8.44:1.
 * -------------------------------------------------------------------------- */
/* THREE ROLES, NOT ONE COLOUR.
 *   --aieo-group-accent  the FILL: active pill, card top rule, header tint.
 *   --aieo-group-fg      text ON that fill.
 *   --aieo-group-ink     the accent used as TEXT ON WHITE (hover labels,
 *                        column headings, card eyebrows).
 * Ink defaults to the accent and only differs where the accent is too light to
 * be read as text: beak amber is 1.89:1 on white. Without this split, hovering
 * any item under Set Up rendered amber-on-white. */
/* THE PALETTE MOVED TO PHP (AIEO_DMM::group_palette()), 2026-07-31; and on
   2026-10-25 (admin chrome 0.25.0, D2) the page's three roles became aliases
   of the chrome's screen section (--ra-screen-sec-ink, -on), so only the
   sidebar and toolbar stripes are still printed from PHP.
   The thirteen `[data-aieo-group="x"] { --aieo-group-accent: … }` rules that
   stood here are now emitted by AIEO_DMM::print_group_palette_css() on
   `admin_head`. They had to move because the WordPress SIDEBAR now lists the
   twelve groups and wears their colours, and the sidebar renders on every
   admin screen — including the many that never load this file. Keeping the
   values here as well would have been a second copy of a palette, which is
   exactly how one drifts.

   Everything BELOW still consumes `--aieo-group-accent` / `-fg` / `-ink`
   exactly as before; only the assignments left. */

/* Nav pill: adopt the group accent, falling back to the bar default for any
   group with no palette entry (a new group renders neutral, never unstyled).
   The second selector is the collapsed one-page group — a plain <a> pill with
   no wrapper, which still carries its group id (see get_subtab_tree()). */

/* --------------------------------------------------------------------------
 *  Grouped subtab — top-level pill that reveals a dropdown of child subtabs
 *  on hover or focus. Uses the same pill aesthetic as a regular subtab so
 *  the bar reads consistently. The caret on the right hints at the group.
 * -------------------------------------------------------------------------- */

/* When a child subtab is the active page, color the parent group pill so
   the user knows where they are. Inherits the variable-driven accent. */

/* BRIDGE THE 6px GAP.
   The panel hangs 6px below the pill, and that strip belongs to neither: the
   group's own box ends at the pill, so a pointer crossing the gap is briefly
   over nothing and :hover drops. An invisible extension of the panel covers
   it, so the pointer stays inside the group for the whole journey.
   Only present while open — the closed panel is parked off-screen, taking its
   bridge with it, so this can never swallow clicks elsewhere on the page. */

/* Hover picks up the GROUP's accent, inherited from the enclosing
   .aieo-dmm-subtab-group[data-aieo-group]. It was a fixed blue, so every
   dropdown in the plugin highlighted the same colour no matter which coloured
   pill you had opened — the one moment the colour coding is most useful is
   while you are inside a group looking for a destination. */

/* No focus ring on a MOUSE click, but keep it for the keyboard.
 *
 * WordPress admin puts a heavy blue outline + box-shadow on :focus, and an
 * anchor keeps focus after it is clicked — so choosing an item from one of
 * these dropdowns left a blue rectangle sitting on the pill menu. :focus-visible
 * is the browser's own answer to exactly this: it fires for keyboard navigation
 * and not for a pointer, so this removes the ring where it is noise and leaves
 * it where somebody tabbing actually needs to see where they are.
 *
 * Scoped to the plugin's own pill menu — the rest of wp-admin keeps its
 * focus styling. */

@supports not (color: color-mix(in srgb, red 10%, transparent)) {
    /* Older Safari/Firefox keep the flat tint; the accent still shows on the
       text colour, which is the part that carries the meaning. */
    
}

/* --------------------------------------------------------------------------
 *  Module panel gap
 * -------------------------------------------------------------------------- */
.aieo-dmm-modules-panel { gap: 20px; }

/* --------------------------------------------------------------------------
 *  Section cards (reuse aieo-modules-box look)
 * -------------------------------------------------------------------------- */
.aieo-dmm-section {
    display: flex;
    flex-direction: column;
    gap: 14px;
    padding: 24px;
    background: var(--aieo-card, #fff);
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12);
    border-radius: 12px;
}
/* An h2 is an h2 at whatever depth the module put it.
 *
 * This was `.aieo-dmm-section > h2` alone — a DIRECT-child selector — so a
 * module that opens <section><card><h2> (Ad-spend connectors, Food & Beverages,
 * and others) missed it entirely and its page title fell back to the browser
 * default, rendering visibly smaller than every other screen's. Restructuring
 * those modules would be the purist fix; matching the card depth as well costs
 * one selector and cannot break a page that was already correct. */
.aieo-dmm-section > h2,
.aieo-dmm-section > .aieo-dmm-card > h2,
.aieo-dmm-modules-panel > .aieo-dmm-card > h2,
.aieo-dmm-modules-panel > .rooster-admin-board > .aieo-dmm-card > h2 {
    font-size: 20px;
    font-weight: 500;
    line-height: 28px;
    margin: 0 0 2px;
    color: var(--aieo-foreground, #101517);
    display: flex;
    align-items: baseline;
    gap: 8px;
}
.aieo-dmm-section > h2 .count {
    color: var(--aieo-muted-fg, #6b7280);
    font-weight: 400;
    font-size: 14px;
}
.aieo-dmm-section > h3 {
    font-size: 15px;
    margin: 6px 0 0;
    color: var(--aieo-foreground, #101517);
    font-weight: 600;
}
.aieo-dmm-section > p.description,
.aieo-dmm-section > .description {
    color: #676f78;
    margin: 0;
    font-size: 13px;
    line-height: 1.55;
}

/* Inner sub-cards inside a box. */
.aieo-dmm-card {
    padding: 18px;
    border: 1px solid var(--aieo-input, #e4e4e7);
    background: var(--aieo-thead-bg, #fafbfc);
    border-radius: 10px;
    display: flex;
    flex-direction: column;
    gap: 10px;
}
/* Stack-spacing between sibling cards. Adjacent-sibling combinator
 * keeps single-card layouts unaffected — the first card sits flush
 * against whatever's above it (h2 / description), only the 2nd+
 * cards in a stack get top margin. */
.aieo-dmm-card + .aieo-dmm-card { margin-top: 16px; }
.aieo-dmm-card h3 { margin: 0; font-size: 15px; font-weight: 600; color: var(--aieo-foreground, #1f2937); }

/* --------------------------------------------------------------------------
 *  Form layout
 * -------------------------------------------------------------------------- */
.aieo-dmm-form > p { margin: 0 0 14px; }
/* The legacy label rules never touch the admin kit's own labels and check labels (a form on the kit's markup keeps the
   form class for its submit handler). */
.aieo-dmm-form label:not([class^="rooster-admin"]) {
    display: block;
    font-weight: 500;
    color: var(--aieo-foreground, #2c3338);
    margin-bottom: 4px;
    font-size: 13px;
}
/* Labels that wrap a radio or checkbox (the "option" labels) should stay
 * inline — otherwise every option stacks on its own line and breaks radio
 * groups. Uses :has() which is supported in every evergreen browser. */
.aieo-dmm-form label:not([class^="rooster-admin"]):has(> input[type="radio"]),
.aieo-dmm-form label:not([class^="rooster-admin"]):has(> input[type="checkbox"]) {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin: 0 16px 0 0;
    font-weight: 400;
    cursor: pointer;
}
/* Fallback for browsers without :has — attach the aieo-dmm-choice class
 * on option labels inside templates to force inline display. */
.aieo-dmm-form label.aieo-dmm-choice {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin: 0 16px 0 0;
    font-weight: 400;
    cursor: pointer;
}
/* Small label that's the "heading" of a radio group. */
.aieo-dmm-form .aieo-dmm-field-label {
    display: block;
    font-weight: 500;
    color: var(--aieo-foreground, #2c3338);
    margin: 0 0 6px;
    font-size: 13px;
}
/* 🚨 A FIELD IS AS WIDE AS ITS VALUE, NOT AS WIDE AS THE PANEL.
 *
 * `width: 100%` with `max-width: 100%` gave every field in every DMM settings
 * form the full width of its cell. On a 1500px screen that is 962px — for a
 * three-digit pixel value, for a two-option dropdown, for "150". Reported by
 * the operator 2026-09-01 against Brand display's logo dimensions, and
 * explicitly as INDICATIVE rather than as one screen.
 *
 * The cap below is the readable measure a settings form wants. Anything that
 * genuinely needs the full width says so with `large-text` or `widefat`, which
 * are WordPress's own words for it and are honoured underneath. */
.aieo-dmm-form input[type="text"]:not([class^="rooster-admin"]),
.aieo-dmm-form input[type="number"]:not([class^="rooster-admin"]),
.aieo-dmm-form input[type="date"]:not([class^="rooster-admin"]),
.aieo-dmm-form input[type="email"]:not([class^="rooster-admin"]),
.aieo-dmm-form input[type="url"]:not([class^="rooster-admin"]),
.aieo-dmm-form select:not([multiple]):not([class^="rooster-admin"]),
.aieo-dmm-form textarea:not([class^="rooster-admin"]) {
    width: 100%;
    max-width: 520px;
    /* The look (border, padding, type, focus) is the chrome's control (admin chrome 0.34.0, the adoption layer). */
    /* ⚠️ A TEXTAREA IS EXEMPT AND IS RESTORED BELOW. It is the one control in
     * this list that is inherently a wants-room control: it exists because the
     * value is long. 18 of them in DMM forms carry no size class at all, and
     * capping those was a regression I introduced with the cap itself, not part
     * of what was reported. The complaint was pixel inputs and dropdowns. */
}

/* ── WordPress's own size classes are the AUTHOR'S STATEMENT OF INTENT ──────
 *
 * `class="small-text"` on `image_max_width` is the module saying "this holds
 * three digits". Core sizes it at 50px; the blanket rule above overrode that
 * and every other one, so the intent was written down and then ignored on
 * every settings screen in the product.
 *
 * 🚨 AND THE EXISTING ATTEMPT AT THIS COULD NEVER HAVE WORKED. A few lines
 * below there is already `.aieo-dmm-form .small-text { max-width: 120px }`.
 * That is (0,2,0). The rule it has to beat is
 * `.aieo-dmm-form input[type="number"]` — and AN ATTRIBUTE SELECTOR COUNTS IN
 * THE SAME COLUMN AS A CLASS, so that one is (0,2,1) and wins. The fix looked
 * right, sat in the file, and did nothing. Naming the element here brings
 * these to (0,2,1) and the tie is broken by their position after it, which is
 * why they must not be moved above it.
 *
 * `width` as well as `max-width`: the rule above sets `width: 100%`, so a cap
 * alone leaves the field free to be narrower than intended in a narrow cell
 * and no wider than intended in a wide one, which is only half the request. */
/* 🚨 A NUMBER IS SHORT BY NATURE, WHETHER OR NOT ANYBODY SAID SO.
 *
 * Honouring `small-text` only fixes the fields whose author remembered to
 * write it. Brand discounts writes neither: `percent` rendered at 520px (the
 * default cap) and `min_subtotal` at 298px, for a value that is at most a few
 * digits. That is the same complaint as the logo dimensions, one class
 * attribute away, and there is no reason to wait for 400-odd call sites to be
 * annotated one by one.
 *
 * `type="number"` IS the annotation. The browser already knows the value is
 * numeric, which is why it draws a spinner. 120px holds eight characters at
 * this size; anything that genuinely needs more says so with `regular-text`,
 * `large-text` or `widefat`, all of which still override this because they are
 * declared after it. */
.aieo-dmm-form input[type="number"] { width: 120px; max-width: 120px; }

.aieo-dmm-form input.tiny-text { width: 70px; max-width: 70px; }
.aieo-dmm-form input.small-text { width: 96px; max-width: 96px; }
.aieo-dmm-form input.regular-text { width: 25em; max-width: 100%; }
.aieo-dmm-form input.large-text,
.aieo-dmm-form input.widefat { width: 100%; max-width: 100%; }
/* Every textarea, classed or not. See the exemption note in the block above. */
.aieo-dmm-form textarea { max-width: 100%; }

/* A dropdown is as wide as its longest option. `width: auto` is what a browser
 * already does for a `<select>` left alone, and it is right here for the same
 * reason the size classes are: "Left / Centre / Right" is not a 962px control,
 * while a list of shipping methods sizes itself without anybody choosing a
 * number. The minimum keeps a two-letter option from becoming a stub.
 *
 * ⚠️ Select2-backed selects are unaffected: they are `display: none` (see the
 * block below) and their visible box is `.select2-container`, which keeps its
 * own full-width rule. */
/* ⚠️ CARD AND SECTION, NOT JUST FORM. Half the product's dropdowns are not
 * inside an `.aieo-dmm-form` at all — the Tools landing picker is a direct
 * child of a card — so a rule scoped to the form leaves them stretched and the
 * fix looks half-applied. This is the same broadening, for the same reason,
 * that the Select2 chip rules needed in 2026-08.
 *
 * `:not(.aieo-c-select)` keeps our own control layer out of it: the table
 * toolbar's "rows per page" is a two-digit dropdown that the 180px minimum
 * would treble. */
.aieo-dmm-form select:not([multiple]),
.aieo-dmm-card select:not([multiple]):not(.aieo-c-select),
.aieo-dmm-section select:not([multiple]):not(.aieo-c-select) {
    width: auto;
    min-width: 180px;
    /* 🚨 25rem, NOT 100%, and this was measured the wrong way round first.
     *
     * `max-width: 100%` looks like the safe value and is the opposite: paired
     * with `width: auto` it lets a select grow to its LONGEST OPTION, and it
     * throws away the cap core already had (`.wp-core-ui select` is
     * `max-width: 25rem`). A sweep of all 91 tabs after the first attempt found
     * the over-wide count had gone UP, from 12 to 34: Fulfillment's courier
     * pickers reached 1437px because a linked shipping-method title is a long
     * sentence, and the Gravity Form pickers on User vitals and Competitions
     * reached 718px for the same reason.
     *
     * A dropdown truncates its closed label gracefully and shows the full text
     * the moment it opens, which is why it can take a tighter cap than the
     * 520px text fields get. 25rem is core's own number for exactly this. */
    max-width: 25rem;
    /* 🚨 `width: auto` IS NOT ENOUGH ON ITS OWN, and this is the half that is
     * easy to miss. `.aieo-dmm-card` is `display: flex; flex-direction: column`,
     * so a select that is a direct child of one is a FLEX ITEM, and a flex
     * item's default `align-self: stretch` fills the cross axis — which in a
     * column is the width. Measured: `gift_kind` on Brand gifts computed to
     * 1210px with `width: auto` resolved, for a dropdown whose longest option is
     * 45 characters. The same control inside a `<td>` sized itself correctly at
     * 260px, which is why this looks fixed on some screens and not on others.
     * `flex-start` is ignored anywhere that is not a flex container. */
    align-self: flex-start;
}

/* All AIEO-DMM Select2-backed selects — remove the native element from the
 * layout entirely. Select2 v4 only needs the <select> in the DOM for value
 * syncing, not rendered, so display:none is safe and leaves no ghost box. */
select.aieo-dmm-brand-select,
select.aieo-dmm-product-select,
select.aieo-dmm-user-select,
select.aieo-dmm-category-select,
select.aieo-dmm-product-search,
.aieo-dmm-form select[multiple],
.aieo-dmm-form select.select2-hidden-accessible,
.aieo-dmm-card select.select2-hidden-accessible,
.aieo-dmm-section select.select2-hidden-accessible,
select.select2-hidden-accessible {
    display: none !important;
    visibility: hidden !important;
    position: absolute !important;
    left: -9999px !important;
    width: 0 !important;
    height: 0 !important;
    padding: 0 !important;
    margin: 0 !important;
    border: 0 !important;
    box-shadow: none !important;
}

/* (earlier no-gap rule replaced by the .aieo-dmm-grid rules below) */
/* ⛔ REMOVED, not moved: `.aieo-dmm-form .small-text { max-width: 120px }`.
 * It was (0,2,0) against an attribute selector at (0,2,1) and had never once
 * applied. Its replacement is in the size-class block above, where it can be
 * read next to the rule it has to beat. */
.aieo-dmm-form input[type="checkbox"],
.aieo-dmm-form input[type="radio"] {
    margin-right: 6px;
    vertical-align: middle;
}

.aieo-dmm-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    gap: 20px 20px;        /* 20px row gap between grid items */
    align-items: start;
    margin-bottom: 16px;   /* breathing room between the grid and the next section (e.g. the "Where will this feed be saved?" card) */
}
/* Every grid cell becomes a vertical stack: label → control → description.
 * Give each element its own gap so a Select2 widget, a date picker and a
 * textarea all line up with the same rhythm no matter what control they use. */
/* `.aieo-dmm-form > .aieo-dmm-card > p` is here because anchoring a titled
 * sub-section inside a form means wrapping its heading + fields in an
 * `.aieo-dmm-card` (which carries the permanent `id="aieo-card-…"`). That
 * wrapper pushes paragraphs that USED to be direct children of the form one
 * level down, and the direct-child selector stopped matching, so the fields
 * fell back to default block <p> with ~1em margins and no flex gap. The card
 * variant must stay in lockstep with the direct-child variant.
 *
 * ⚠ `:not(.description)` IS LOAD-BEARING, AND IT IS A SPECIFICITY FIX.
 *
 * Written without it, the card variant scores (0,2,1) and therefore BEATS
 * `.aieo-dmm-form .description` at (0,2,0) further down — so every
 * `p.description` that is a direct child of a card inside a form flipped from
 * `display:block` to `display:flex; flex-direction:column`. Descriptions built
 * with printf() that carry inline markup then break apart: brand-gifts' wording
 * hint contains two real `<code>{remaining}</code>` elements, and as flex items
 * in a column each took its own line, rendering one sentence as five.
 *
 * The plain `.aieo-dmm-form > p` above never had this problem because it scores
 * (0,1,1) and LOSES to `.description` — so "lockstep with the direct-child
 * variant" has to mean lockstep in what it matches too, not just in what it
 * declares. 28 descriptions across 8 files were affected. */
/* 🚨 `.aieo-prodpick-rule` IS A GRID CELL, AND IT CANNOT BE A `<p>`.
 *
 * The picker's root is a `<div>`, and an HTML parser CLOSES an open `<p>` the
 * moment it meets a `<div>`. So `<p><div class="aieo-prodpick-rule">…</div></p>`
 * does not nest — it becomes an empty `<p>`, the div, and a second empty `<p>`,
 * i.e. THREE grid children where the author wrote one. Measured on Brand
 * discounts when the term fields moved to the picker: `.aieo-dmm-grid` had 12
 * children instead of 6, five of them empty, and the six fields scattered
 * across five columns at unrelated heights. The markup looked correct in the
 * source and correct in isolation; only the child COUNT showed it.
 *
 * Two halves to the fix: the call sites emit the div directly (no `<p>`
 * wrapper), and the cell rules below match it as well as `p` so the picker
 * inherits the same label → control → description rhythm as every neighbouring
 * field instead of falling back to its own margins. */
.aieo-dmm-grid p,
.aieo-dmm-form > p,
.aieo-dmm-form > .aieo-dmm-card > p:not(.description) {
    margin: 0 0 6px;
    display: flex;
    flex-direction: column;
    gap: 4px;
}
/* A paragraph that holds the form's commit (its buttons, maybe a status) and no field keeps each button at its
   natural width (rule P8, UI wave 1): the column above stretches what it holds, which drew Save across the card. */
.aieo-dmm-grid p:has(> .button):not(:has(> input, > select, > textarea, > label)),
.aieo-dmm-form > p:has(> .button):not(:has(> input, > select, > textarea, > label)),
.aieo-dmm-form > .aieo-dmm-card > p:not(.description):has(> .button):not(:has(> input, > select, > textarea, > label)) {
    align-items: flex-start;
}
.aieo-dmm-grid p > label,
.aieo-dmm-form > p > label,
.aieo-dmm-form > .aieo-dmm-card > p > label { margin-bottom: 0; }
/* The Browse button is the control in this cell: it must not stretch to the
   column, the way a flex item otherwise would. */


/* --------------------------------------------------------------------------
 *  EXPLICIT COLUMN COUNTS — for rows whose symmetry is the point.
 *
 *  The base `.aieo-dmm-grid` is `repeat(auto-fit, minmax(240px, 1fr))`, which
 *  is right for a bag of unrelated fields: it packs as many as fit and the
 *  count changes with the viewport. It is WRONG when a row is a set the
 *  operator reads as a set — the four targeting pickers (brands, categories,
 *  needs, specific products) are one decision in four parts, and auto-fit
 *  scattered them 3-and-1 across five columns with the leftovers of the
 *  previous row. Declaring the count is what makes the row read as a row.
 *
 *  Steps down rather than reflowing to one column at the first breakpoint, so
 *  a laptop keeps two per line instead of a very long ladder.
 * -------------------------------------------------------------------------- */
.aieo-dmm-grid--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.aieo-dmm-grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
@media (max-width: 1400px) {
    .aieo-dmm-grid--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 1100px) {
    .aieo-dmm-grid--3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 782px) {
    .aieo-dmm-grid--4,
    .aieo-dmm-grid--3 { grid-template-columns: minmax(0, 1fr); }
}
/* A field that owns its own line above such a row. `max-width` because a text
   input stretched to 1300px is not a better input, it is a worse one. */
.aieo-dmm-field-own-line { margin: 0 0 10px; }
.aieo-dmm-field-own-line > input,
.aieo-dmm-field-own-line > select { max-width: 25rem; }

/* Descriptions sit on their own line below the control with a small gap. */
.aieo-dmm-form .description,
.aieo-dmm-grid p .description,
.aieo-dmm-grid p span.description {
    display: block;
    margin-top: 4px;
    font-size: 12px;
    color: var(--aieo-muted-fg, #6b7280);
    line-height: 1.45;
}

.aieo-dmm-checkbox-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
    gap: 8px 16px;
}
.aieo-dmm-checkbox-grid label {
    display: flex;
    align-items: center;
    gap: 6px;
    margin: 0;
    font-weight: 400;
}
.aieo-dmm-checkbox-grid code {
    background: #f4f4f4;
    padding: 1px 5px;
    font-size: 11px;
    color: #1f4620;
    border-radius: 3px;
}

.aieo-dmm-actions {
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
    margin: 16px 0 0;
    padding-top: 14px;
    border-top: 1px solid #eef0f3;
}

/* Form submit rows (p.submit) — proper vertical breathing room. */
.aieo-dmm-form p.submit,
.aieo-dmm-section p.submit {
    margin: 18px 0 0;
    padding-top: 14px;
    border-top: 1px solid #eef0f3;
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
}

/* Upload row: file input + primary action side by side. */
.aieo-dmm-upload-row {
    display: flex;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
}
.aieo-dmm-upload-row input[type="file"] {
    flex: 1 1 300px;
    padding: 8px;
    border: 1px dashed var(--aieo-input, #cbd5d9);
    border-radius: 6px;
    background: var(--aieo-thead-bg, #fafbfc);
}
.aieo-dmm-upload-row input[type="file"]:hover {
    border-color: var(--aieo-group-accent, #f11569);
    background: #fff7fa;
    background: color-mix(in srgb, var(--aieo-group-accent, #f11569) 5%, #fff);
}

/* Equal-sized buttons in action rows: the same min-width so a group of buttons lines up whatever the labels;
   the look is the chrome's (admin chrome 0.33.0). */
.aieo-dmm-btn-fixed {
    min-width: 200px;
}
.aieo-dmm-actions .aieo-dmm-btn-fixed,
.aieo-dmm-upload-row .aieo-dmm-btn-fixed {
    flex: 0 0 auto;
}

/* CORE BUTTONS ON A CHROME SCREEN ARE THE CHROME'S (admin chrome 0.33.0, UI-PLAN Phase 3): the kit's outline button,
   its small and its primary in the product's ink, through the library's adoption layer. The rules that lived here
   (the 200 px / 40 px sizing, the primary filled in the group's accent, the secondary outlined in the group's ink,
   the compact .button-small, all !important) made most of the 147 looks of button the uniformity census counted on
   One's pages and fought the kit; on core's screens (the competition and event editors) core's own button remains.
   The group-accent primary (the operator's choice of 2026-09-05) is one alias line away if the owner wants it back
   on every product: docs/admin-chrome.md. */

/* Shared horizontal-scroll shell for wide admin list tables — the same
   treatment the Google Reviews tables got. Wrap the table, don't clip:
   <div class="aieo-dmm-scroll-x"><table …>. */
.aieo-dmm-scroll-x { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.aieo-dmm-scroll-x > table { min-width: 900px; }

/* Tiny inline utility buttons (e.g. field-map "+" add-row) — compact square. */
.aieo-dmm-form .aieo-dmm-feed-add-row,
.aieo-dmm-form button.aieo-dmm-feed-add-row {
    min-width: 36px !important;
    width: 36px !important;
    height: 36px !important;
    padding: 0 !important;
}

/* Legacy explicit "fixed" class — now identical to the default. Kept so
 * templates that still set it keep working, no size jump. */
.aieo-dmm-btn-fixed {
    min-width: 200px !important;
    height: 40px !important;
    line-height: 24px !important;
    padding: 7px 18px !important;
    border-radius: 8px !important;
    font-weight: 600 !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    box-sizing: border-box !important;
}
.aieo-dmm-actions .aieo-dmm-btn-fixed,
.aieo-dmm-upload-row .aieo-dmm-btn-fixed {
    flex: 0 0 auto;
}

/* --------------------------------------------------------------------------
 *  Tables (CRUD lists)
 * -------------------------------------------------------------------------- */
.aieo-dmm-section table.widefat,
.aieo-dmm-section table.aieo-table {
    background: var(--aieo-card, #fff);
    border: 1px solid var(--aieo-input, #e4e4e7);
    border-radius: 8px;
    overflow: hidden;
    border-collapse: separate;
    border-spacing: 0;
}
.aieo-dmm-section table.widefat thead th,
.aieo-dmm-section table.aieo-table thead th {
    background: var(--aieo-muted, #f6f7f7);
    font-weight: 600;
    color: var(--aieo-foreground, #1f2937);
    border-bottom: 1px solid var(--aieo-input, #e4e4e7);
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.3px;
}
.aieo-dmm-section table.widefat tbody td {
    vertical-align: middle;
}

/* Dedicated AJAX DataTable. */

.aieo-dmm-datatable-toolbar {
    display: flex;
    gap: 10px;
    padding: 10px 12px;
    border-bottom: 1px solid var(--aieo-input, #e4e4e7);
    background: var(--aieo-thead-bg, #fafbfc);
    align-items: center;
    flex-wrap: wrap;
}
.aieo-dmm-datatable-toolbar input[type="search"],
.aieo-dmm-datatable-toolbar input[type="text"] {
    padding: 6px 10px;
    border: 1px solid var(--aieo-input, #cbd5d9);
    border-radius: 6px;
    min-width: 220px;
}
.aieo-dmm-datatable-toolbar label {
    font-size: 12px;
    color: var(--aieo-tone-secondary, #555);
    display: flex;
    align-items: center;
    gap: 4px;
    margin: 0;
}
.aieo-dmm-datatable-toolbar .spacer { flex: 1; }

.aieo-dmm-datatable thead th.sortable { cursor: pointer; }
/* --aieo-group-ink, not the raw accent: these are LETTERS ON WHITE, and Set Up's
   beak amber is 1.89:1 there. Ink defaults to the accent everywhere else. */
.aieo-dmm-datatable thead th.sortable:hover { color: var(--aieo-group-ink, #f11569); }
.aieo-dmm-datatable thead th .sort-indicator { color: #aaa; margin-left: 4px; font-size: 10px; }
.aieo-dmm-datatable thead th.sorted-asc .sort-indicator,
.aieo-dmm-datatable thead th.sorted-desc .sort-indicator { color: var(--aieo-group-ink, #f11569); }

.aieo-dmm-datatable td.editable {
    cursor: text;
    background: #fffbf2;
    font-variant-numeric: tabular-nums;
}
.aieo-dmm-datatable td.editable:hover { background: #fff3cd; }
.aieo-dmm-datatable td.editable input {
    width: 100%;
    padding: 4px 6px;
    font-size: 13px;
    border: 1px solid var(--aieo-group-accent, #f11569);
    border-radius: 4px;
}
.aieo-dmm-datatable-footer {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 10px 12px;
    border-top: 1px solid var(--aieo-input, #e4e4e7);
    background: var(--aieo-thead-bg, #fafbfc);
    font-size: 12px;
    color: var(--aieo-tone-secondary, #555);
    flex-wrap: wrap;
    gap: 10px;
}
.aieo-dmm-datatable-pager {
    display: flex;
    gap: 4px;
}
.aieo-dmm-datatable-pager button {
    padding: 4px 10px;
    border: 1px solid var(--aieo-input, #cbd5d9);
    background: var(--aieo-card, #fff);
    border-radius: 4px;
    cursor: pointer;
    font-size: 12px;
}
.aieo-dmm-datatable-pager button:disabled { opacity: 0.4; cursor: not-allowed; }
.aieo-dmm-datatable-pager button.is-current {
    background: var(--aieo-group-accent, #f11569);
    color: var(--aieo-group-fg, #fff);
    border-color: var(--aieo-group-accent, #f11569);
}
.aieo-dmm-datatable-empty {
    padding: 32px;
    text-align: center;
    color: var(--aieo-muted-fg, #6b7280);
    font-style: italic;
}

.aieo-dmm-pagination { margin: 14px 0; }
.aieo-dmm-pagination .page-numbers {
    padding: 4px 9px;
    border: 1px solid var(--aieo-border, #dcdcde);
    margin: 0 2px;
    text-decoration: none;
    border-radius: 4px;
    color: var(--aieo-foreground, #333);
}
.aieo-dmm-pagination .page-numbers.current {
    background: var(--aieo-group-accent, #f11569);
    color: var(--aieo-group-fg, #fff);
    border-color: var(--aieo-group-accent, #f11569);
}

/* --------------------------------------------------------------------------
 *  Progress (batches)
 * -------------------------------------------------------------------------- */
.aieo-dmm-progress { margin-top: 12px; }
.aieo-dmm-progress-bar {
    background: #eef0f3;
    height: 14px;
    border-radius: 7px;
    overflow: hidden;
}
.aieo-dmm-progress-bar span {
    display: block;
    height: 100%;
    background: linear-gradient(90deg, #f11569, #667eea);
    transition: width 0.25s;
    width: 0;
}
.aieo-dmm-progress-text { margin: 6px 0 0; font-size: 12px; color: var(--aieo-tone-secondary, #555); }
.aieo-dmm-progress-log {
    background: var(--aieo-mono, #1e1e1e);
    color: #b8e6b8;
    padding: 10px;
    border-radius: 6px;
    font-size: 11px;
    max-height: 200px;
    overflow: auto;
    font-family: Consolas, "SF Mono", Menlo, monospace;
    margin-top: 8px;
}

/* --------------------------------------------------------------------------
 *  Flash messages
 * -------------------------------------------------------------------------- */
/* ON A CHROME SCREEN THE FLASH IS THE CHROME'S TOAST (admin chrome 0.33.0, adopt/rooster-one.css, D3d); these rules
   stay for core's screens (the competition and event editors), where the script runs without the chrome. The
   amber callout's rules are gone: it is the chrome's inline warning notice (its pages are all chrome screens). */
.aieo-dmm-flash {
    position: fixed;
    top: 50px;
    right: 20px;
    z-index: 100000;
    min-width: 260px;
    pointer-events: none;
}
.aieo-dmm-flash-item {
    background: var(--aieo-card, #fff);
    border-left: 4px solid var(--aieo-info, #667eea);
    padding: 12px 16px;
    margin-top: 8px;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
    border-radius: 6px;
    pointer-events: auto;
    font-size: 13px;
}
.aieo-dmm-flash-item.error { border-left-color: #dc3232; }
.aieo-dmm-flash-item.success { border-left-color: var(--aieo-success, #46b450); }

/* --------------------------------------------------------------------------
 *  Recipe panel (Loyalty Classes tab has a table of radios)
 * -------------------------------------------------------------------------- */
.aieo-dmm-section .form-table th {
    width: 220px;
    font-weight: 600;
    color: var(--aieo-foreground, #1f2937);
}
.aieo-dmm-section .form-table td select { min-width: 260px; }

/* --------------------------------------------------------------------------
 *  Product Needs editor
 * -------------------------------------------------------------------------- */
.aieo-dmm-needs-zone {
    border: 1px solid var(--aieo-input, #e4e4e7);
    padding: 14px;
    margin-bottom: 14px;
    border-radius: 10px;
    background: var(--aieo-thead-bg, #fafbfc);
}
.aieo-dmm-needs-zone h4 {
    margin: 0 0 10px;
    font-size: 13px;
    text-transform: uppercase;
    letter-spacing: 0.4px;
    color: var(--aieo-muted-fg, #6b7280);
}
.aieo-dmm-chips {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    min-height: 32px;
}
.aieo-dmm-chips li {
    /* The look is the chrome's solid chip (admin chrome 0.30.0, adopt/rooster-one.css, D3b); a hidden need is grey there. */
    cursor: move;
    user-select: none;
    list-style: none;
}
.aieo-dmm-chip-placeholder {
    display: inline-block;
    background: rgba(241, 21, 105, 0.15);
    background: color-mix(in srgb, var(--aieo-group-accent, #f11569) 15%, transparent);
    border: 2px dashed rgba(241, 21, 105, 0.5);
    border-color: color-mix(in srgb, var(--aieo-group-accent, #f11569) 50%, transparent);
    border-radius: 16px;
    min-width: 100px;
    min-height: 26px;
    margin: 0 4px;
    list-style: none;
}
.aieo-dmm-checkboxes {
    list-style: none;
    padding: 0;
    margin: 0;
    max-height: 1080px;
    overflow: auto;
    /* 6-column balanced grid (slug column removed → labels are short
       enough to fit). Falls back to fewer columns on narrow viewports
       via auto-fit, which keeps each cell at least ~150px wide. */
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: 4px 12px;
}
@media (min-width: 1100px) {
    .aieo-dmm-checkboxes {
        grid-template-columns: repeat(6, minmax(0, 1fr));
    }
}
.aieo-dmm-checkboxes li {
    padding: 4px 6px;
    border-radius: 4px;
    font-size: 12.5px;
    line-height: 1.4;
    transition: background 0.12s;
}
.aieo-dmm-checkboxes li:hover { background: var(--aieo-muted, #f3f4f6); }
.aieo-dmm-checkboxes li > label {
    display: grid;
    grid-template-columns: auto 1fr;
    align-items: start;
    column-gap: 6px;
    cursor: pointer;
    overflow-wrap: anywhere;
}
.aieo-dmm-checkboxes li > label > input[type="checkbox"] {
    margin-top: 2px;
}
.aieo-dmm-checkboxes li.is-hidden-need {
    background: repeating-linear-gradient(
        45deg,
        #f3f4f6,
        #f3f4f6 4px,
        #d1d5db 4px,
        #d1d5db 8px
    );
    border: 1px dashed var(--aieo-muted-fg, #6b7280);
}
.aieo-dmm-checkboxes li.is-hidden-need code { background: var(--aieo-input, #d1d5db); }

/* The count line under the search above the available-needs grid. The search box itself is the library's input
 * with its Lucide search icon (product-needs.php): its old box and its emoji icon went with it (UI wave 2, lead). */
.aieo-dmm-needs-search-meta {
    font-size: 11px;
    color: var(--aieo-muted-fg, #6b7280);
    margin: 4px 2px 0;
    min-height: 14px;
}

/* --------------------------------------------------------------------------
 *  ERP bridge hook cards
 * -------------------------------------------------------------------------- */
.aieo-dmm-hook-card {
    background: var(--aieo-thead-bg, #fafbfc);
    padding: 16px 18px;
    border: 1px solid var(--aieo-input, #e4e4e7);
    border-radius: 8px;
    margin-bottom: 14px;
}
.aieo-dmm-hook-card h3 { margin-top: 0; font-size: 14px; }
.aieo-dmm-hook-type {
    display: inline-block;
    padding: 2px 8px;
    font-size: 10px;
    border-radius: 3px;
    background: var(--aieo-info, #667eea);
    color: var(--aieo-primary-fg, #fff);
    margin-right: 6px;
    font-weight: 700;
    letter-spacing: 0.5px;
}
.aieo-dmm-hook-type.aieo-dmm-hook-action { background: var(--aieo-warning, #f59e0b); }
.aieo-dmm-code {
    background: var(--aieo-mono, #1e1e1e);
    color: #e8e8e8;
    padding: 12px;
    border-radius: 6px;
    white-space: pre-wrap;
    overflow-x: auto;
    font-size: 12px;
    font-family: Consolas, "SF Mono", Menlo, monospace;
}

/* --------------------------------------------------------------------------
 *  Gift badge, field-map, scanner shortcodes
 * -------------------------------------------------------------------------- */
.aieo-dmm-field-map .drag-handle {
    cursor: move;
    color: #999;
    width: 24px;
    text-align: center;
}
.aieo-dmm-staff-scanner,
.aieo-dmm-customer-scanner {
    max-width: 480px;
    margin: 14px 0;
    padding: 18px;
    border: 1px solid var(--aieo-input, #e4e4e7);
    border-radius: 10px;
    background: var(--aieo-card, #fff);
}
.aieo-dmm-scanner-result,
.aieo-dmm-customer-result {
    margin-top: 14px;
    padding: 12px;
    background: #f4f8fb;
    border-radius: 6px;
}
.aieo-dmm-customer-result img {
    max-width: 120px;
    float: left;
    margin-right: 12px;
}

/* SELECT2 IS SKINNED BY THE CHROME'S ADOPTION LAYER on a chrome screen (admin chrome 0.34.0, D3e): the control, the
   chips and the dropdown are the kit's. The 430-line skin that lived here, !important throughout, is gone; on core's
   screens (the competition and event editors) Select2 wears its own look. */

/* --------------------------------------------------------------------------
 *  Callout + bulleted "how it works" list (reused across subtabs).
 * -------------------------------------------------------------------------- */

.aieo-dmm-bullets {
    list-style: disc;
    margin: 8px 0 0 20px;
    padding: 0;
}
.aieo-dmm-bullets > li {
    margin: 0 0 10px;
    color: var(--aieo-tone-secondary, #374151);
    line-height: 1.55;
}
.aieo-dmm-bullets > li strong { color: var(--aieo-foreground, #101517); }

/* --------------------------------------------------------------------------
 *  Attribution tab (DMM → Attribution)
 * -------------------------------------------------------------------------- */
.aieo-attr-tiles {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
    gap: 12px;
    margin: 6px 0 4px;
}
.aieo-attr-tile {
    padding: 12px 14px;
    background: var(--aieo-card, #fff);
    border: 1px solid var(--aieo-input, #e4e4e7);
    border-radius: 8px;
    position: relative;
}
.aieo-attr-tile-label {
    font-size: 11px;
    color: var(--aieo-muted-fg, #6b7280);
    text-transform: uppercase;
    letter-spacing: 0.05em;
    font-weight: 600;
    /* Use plain block + inline flow (NOT flex) so the help icon stays
       at the end of the last line of the title text — even when the
       title wraps onto multiple lines. The previous flex layout
       pushed the icon onto its own row whenever the title wrapped.
       overflow-wrap: anywhere keeps long all-caps table names like
       WP_AIEO_CUSTOMER_INTELLIGENCE inside the tile. */
    overflow-wrap: anywhere;
    word-break: break-word;
    max-width: 100%;
}
.aieo-attr-tile-label > span:first-child {
    display: inline;
    margin-right: 4px;
}
.aieo-attr-tile-label > .aieo-attr-tile-help {
    /* Force the icon to flow inline with the title text. */
    vertical-align: middle;
}
.aieo-attr-tile-help {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 14px;
    height: 14px;
    border-radius: 50%;
    background: var(--aieo-input, #e4e4e7);
    color: var(--aieo-muted-fg, #6b7280);
    font-size: 10px;
    font-weight: 700;
    cursor: help;
    text-transform: none;
    line-height: 1;
    user-select: none;
}
.aieo-attr-tile-help:hover { background: var(--aieo-info, #c084fc); color: var(--aieo-primary-fg, #fff); }
.aieo-attr-tile-popover {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    margin-top: 6px;
    padding: 10px 12px;
    background: var(--aieo-mono, #1f2937);
    color: var(--aieo-muted-fg, #f9fafb);
    font-size: 12px;
    line-height: 1.45;
    border-radius: 6px;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
    z-index: 10;
    text-transform: none;
    letter-spacing: 0;
    font-weight: 400;
    white-space: normal;
}
.aieo-attr-tile:hover .aieo-attr-tile-popover { display: block; }
.aieo-attr-tile-popover::before {
    content: "";
    position: absolute;
    top: -5px;
    left: 16px;
    width: 10px;
    height: 10px;
    background: var(--aieo-mono, #1f2937);
    transform: rotate(45deg);
}
.aieo-attr-tile-value {
    font-size: 22px;
    font-weight: 600;
    color: var(--aieo-foreground, #111827);
    margin-top: 4px;
    line-height: 1.2;
}

/* Status pills for the detail table */

/* Detail DataTable — toolbar + body + footer/pager */
.aieo-attr-detail-table { display: flex; flex-direction: column; gap: 10px; }
.aieo-attr-dt-toolbar {
    display: flex;
    gap: 10px;
    align-items: center;
    flex-wrap: wrap;
}
.aieo-attr-dt-toolbar .spacer { flex: 1; }
.aieo-attr-dt-search {
    min-width: 280px;
    padding: 6px 10px;
    border: 1px solid var(--aieo-input, #d1d5db);
    border-radius: 6px;
    background: var(--aieo-card, #fff);
}
.aieo-attr-dt-perpage,
.aieo-attr-dt-toolbar label select {
    padding: 4px 6px;
    border: 1px solid var(--aieo-input, #d1d5db);
    border-radius: 6px;
    background: var(--aieo-card, #fff);
}
.aieo-attr-dt-body {
    min-height: 60px;
    transition: opacity 120ms ease;
}
.aieo-attr-dt-empty {
    padding: 24px;
    text-align: center;
    color: var(--aieo-muted-fg, #6b7280);
    background: var(--aieo-muted, #f9fafb);
    border: 1px dashed var(--aieo-border, #e5e7eb);
    border-radius: 6px;
}
.aieo-attr-dt-table thead th.sortable,
.aieo-attr-sortable-table thead th[data-sort-type] {
    cursor: pointer;
    user-select: none;
}
.aieo-attr-dt-table thead th.sortable:hover,
.aieo-attr-sortable-table thead th[data-sort-type]:hover { background: var(--aieo-muted, #f3f4f6); }
.aieo-attr-dt-table thead th.sorted-asc,
.aieo-attr-dt-table thead th.sorted-desc,
.aieo-attr-sortable-table thead th.sorted-asc,
.aieo-attr-sortable-table thead th.sorted-desc { color: var(--aieo-foreground, #1f2937); }
.aieo-attr-dt-sort-ind {
    display: inline-block;
    margin-left: 4px;
    font-size: 10px;
    color: var(--aieo-tone-muted, #9ca3af);
}
.aieo-attr-dt-table thead th.sorted-asc .aieo-attr-dt-sort-ind,
.aieo-attr-dt-table thead th.sorted-desc .aieo-attr-dt-sort-ind,
.aieo-attr-sortable-table thead th.sorted-asc .aieo-attr-dt-sort-ind,
.aieo-attr-sortable-table thead th.sorted-desc .aieo-attr-dt-sort-ind {
    color: #4f46e5;
}
.aieo-attr-dt-footer {
    display: flex;
    gap: 10px;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
}
.aieo-attr-dt-summary {
    color: var(--aieo-muted-fg, #6b7280);
    font-size: 12px;
}
.aieo-attr-dt-pager {
    display: inline-flex;
    gap: 4px;
    flex-wrap: wrap;
}
.aieo-attr-dt-pager button {
    min-width: 30px;
    padding: 4px 8px;
    border: 1px solid var(--aieo-input, #d1d5db);
    background: var(--aieo-card, #fff);
    color: var(--aieo-foreground, #1f2937);
    border-radius: 4px;
    cursor: pointer;
}
.aieo-attr-dt-pager button:hover:not(:disabled) { background: var(--aieo-muted, #f3f4f6); }
.aieo-attr-dt-pager button.is-current {
    background: #4f46e5;
    border-color: #4338ca;
    color: var(--aieo-primary-fg, #fff);
    font-weight: 600;
}
.aieo-attr-dt-pager button:disabled {
    color: var(--aieo-tone-muted, #d1d5db);
    cursor: not-allowed;
}
.aieo-attr-dt-gap {
    padding: 4px 2px;
    color: var(--aieo-tone-muted, #9ca3af);
}

/* --------------------------------------------------------------------------
 *  WordPress color-picker overrides — DMM admin pages.
 *  Targets the actual rendered button:
 *    <button class="button wp-color-result">
 *      <span class="wp-color-result-text">Select Color</span>
 *    </button>
 *  WP's default styling fills the button with grey (`.button`) and adds a
 *  vertical separator (border-left on `.wp-color-result-text`) between the
 *  swatch and the label. Both removed so the button reads as one clean pill.
 *  Scoped to .aieo-dmm-section so we don't leak into core WP color pickers
 *  on unrelated admin pages.
 * -------------------------------------------------------------------------- */
.aieo-dmm-section .wp-color-result.button,
.aieo-dmm-form    .wp-color-result.button {
    /* DO NOT override `background` — wp-color-picker sets the selected swatch
       colour INLINE on this button; a transparent background here hid every
       swatch on every DMM colour picker. Only flatten the box-shadow. */
    box-shadow: none !important;
}
.aieo-dmm-section .wp-color-result.button:hover,
.aieo-dmm-section .wp-color-result.button:focus,
.aieo-dmm-form    .wp-color-result.button:hover,
.aieo-dmm-form    .wp-color-result.button:focus {
    box-shadow: 0 0 0 1px #c084fc !important;
}
/* Keep the "Select Color" label readable on ANY swatch colour (incl. dark
   ones) by giving the label span its own translucent light backdrop instead
   of the old transparent + grey text that vanished on dark swatches. */
.aieo-dmm-section .wp-color-result-text,
.aieo-dmm-form    .wp-color-result-text {
    border-left: 0 !important;
    background: rgba(255, 255, 255, 0.85) !important;
    color: var(--aieo-foreground, #1f2937) !important;
}

/* --------------------------------------------------------------------------
 * Sectioned dropdowns (Storefront Display, etc.)
 *
 * When a group registers sections via AIEO_DMM::get_section_definitions(),
 * the panel emits a `.has-sections` class on the menu and one
 * `.aieo-dmm-subtab-menu-section` divider per non-default section.
 * The first section divider has its top margin reset so the panel
 * doesn't get an awkward leading gap.
 * -------------------------------------------------------------------------- */
/* --------------------------------------------------------------------------
 * Mega-menu layout — sectioned panels (currently the Storefront Display
 * group with 25+ modules across 3 sections) render as a grid of columns
 * instead of one tall stack. Each section becomes a `.aieo-dmm-subtab-menu-column`
 * with a coloured header + its items below.
 *
 * `repeat(auto-fit, minmax(180px, 1fr))` lets the grid auto-collapse on
 * narrow viewports (admin sidebar collapsed → less header width) without
 * any media-query gymnastics.
 * -------------------------------------------------------------------------- */

/* A second section stacked inside the same column needs air above it, or its
   heading sits hard against the last link of the section before it and the two
   read as one list. The first heading in a column keeps its own spacing. */

/* Section headings are SHADES OF THEIR GROUP'S ACCENT.
 *
 * They used to be four hardcoded hues (indigo / rose / emerald / orange), which
 * predated the group palette and then fought it: a deep-blue Insights dropdown
 * showed headings in three colours belonging to no family, none of them Rooster
 * colours. Same rule as the rest of the palette — hue means kind, shade means
 * member — so a column heading now says "still inside this group" while staying
 * distinct from its neighbours.
 *
 * Keyed on the COLUMN'S POSITION, not on a section id. That is deliberate: the
 * old map covered exactly four of the twenty-odd sections in the plugin, so
 * every section added since rendered grey, and Marketplaces would have needed a
 * fifth entry today. Position-based needs no map and cannot fall behind.
 *
 * The ramp only ever goes DARKER (0 / 14 / 26 / 38% black). Darker on white is
 * always more contrast, so no step can drop 10px uppercase text below legible;
 * mixing toward white would have done the opposite. A fifth column and beyond
 * reuse the last step rather than fading away.
 */

@supports not (color: color-mix(in srgb, red 10%, black)) {
    /* Older engines: every heading takes the flat group accent. The family
       reads correctly; only the within-group ramp is lost. */
    
    
}

/* e-Shop Insights report links can be long (esp. the Greek titles) — let them
 * WRAP inside their column instead of overflowing into the neighbour. Scoped to
 * sectioned (multi-column) panels; flat single-column menus keep nowrap. */

/* NO PER-SECTION-ID COLOURS. There were seven of them here — amber, indigo,
 * emerald, rose, cyan, violet and a second emerald — and every one of them
 * outranked the ramp above it: `[data-section-id="x"]` beats `:nth-child(n)`
 * on specificity AND came later in the file, so the block directly above was
 * dead CSS for the only group that has six sections. That is what the Insights
 * dropdown was showing (operator report 2026-08-29, "the colours of the
 * sections are not the same"): six unrelated hues, none of them Rooster
 * colours, under a deep-blue Insights pill.
 *
 * Colour here means GROUP, and it is the pill above the panel that says which
 * group you are in. A per-section hue says "these six things are six different
 * kinds", which is exactly wrong — they are six columns of one menu. Adding an
 * eighth entry for each new section was also a map that could only fall behind:
 * it covered seven of the twenty-odd sections in the plugin and every section
 * added since rendered grey.
 */

/* =============================================================================
 * SEO → Content Opportunities
 * ========================================================================== */
/* No cap: this intro sits above a full-width table, and a paragraph that
   stops at 880px next to a 1700px table reads as a stray note. */
.aieo-opp-intro { max-width: none; }
.aieo-opp-status { margin-left: 8px; font-size: 12px; color: var(--aieo-muted-fg, #64748b); }

/* The priority controls' look is the chrome's on a chrome screen (admin chrome 0.37.0, D3h: the details, the fieldsets
   as sub-cards, the hints as help, each label-and-box pair a two-column field row); the layout stays here. */
.aieo-opp-controls > summary { cursor: pointer; font-weight: 600; }
.aieo-opp-controls-grid { display: flex; flex-wrap: wrap; gap: 18px; margin: 12px 0; }
.aieo-opp-fieldset { flex: 1 1 220px; min-width: 220px; }
.aieo-opp-fieldset input[type="number"] { width: 84px; }
.aieo-opp-fieldset label.aieo-opp-strong { font-weight: 700; }

.aieo-opp-chips { margin: 10px 0; }
.aieo-opp-table .aieo-opp-col-num { width: 92px; text-align: center; }
.aieo-opp-table .aieo-opp-col-quad { width: 130px; }
.aieo-opp-table .aieo-opp-col-pin { width: 90px; }

.aieo-opp-bar-fill { display: block; background: var(--aieo-info, #7c3aed); height: 8px; width: 0; }

.aieo-opp-table .aieo-opp-col-act { width: 240px; }

/* ── The module intro is a card ONLY WHERE IT IS NOT ALREADY IN ONE ────────
   Most modules open with an <h2> + <p class="description"> and then put their
   controls in a card, leaving the intro floating on the grey page background.
   But NOT all of them: .aieo-dmm-section is itself a white card (background,
   radius, shadow, 24px padding) AND a flex column with a 14px gap.

   Carding the intro blindly therefore drew a SECOND card inside that one, and
   the parent's flex gap split it into two boxes with a hole between them — the
   Google Reviews symptom. No margin on the children can close a gap that comes
   from the parent's `gap`.

   So this is scoped to intros that are NOT already inside a card: a bare h2 in
   the panel (competitions), or one in a plain wrapper such as #aieo-food-root
   (food & beverages). Modules already using .aieo-dmm-section are left exactly
   as they were, because they were never the problem.

   Matched on the PATTERN — an h2 immediately followed by a description — rather
   than :first-child, which an earlier attempt used and which any leading
   element defeats. :has() keeps a standalone h2 from rendering as a box with
   no floor. */
.aieo-dmm-modules-panel > h2:has(+ p.description),
.aieo-dmm-modules-panel > div:not(.aieo-dmm-section):not(.aieo-dmm-card):not(.rooster-admin-board) > h2:has(+ p.description),
.aieo-dmm-modules-panel > .rooster-admin-board > h2:has(+ p.description),
.aieo-dmm-modules-panel > .rooster-admin-board > div:not(.aieo-dmm-section):not(.aieo-dmm-card) > h2:has(+ p.description) {
    background: var(--aieo-card, #fff); border: 1px solid var(--aieo-border, #dcdcde); border-bottom: 0;
    border-radius: 8px 8px 0 0; margin: 0; padding: 14px 18px 4px;
    font-size: 18px;
}
.aieo-dmm-modules-panel > h2 + p.description,
.aieo-dmm-modules-panel > div:not(.aieo-dmm-section):not(.aieo-dmm-card):not(.rooster-admin-board) > h2 + p.description,
.aieo-dmm-modules-panel > .rooster-admin-board > h2 + p.description,
.aieo-dmm-modules-panel > .rooster-admin-board > div:not(.aieo-dmm-section):not(.aieo-dmm-card) > h2 + p.description {
    background: var(--aieo-card, #fff); border: 1px solid var(--aieo-border, #dcdcde); border-top: 0;
    border-radius: 0 0 8px 8px; margin: 0 0 16px; padding: 0 18px 14px;
    /* !important because ~34 modules set an inline max-width (760-880px) on
       their description; an inline style beats a stylesheet rule, so the
       heading spanned full width while the description stopped short. */
    max-width: none !important;
}

/* CANCEL THE PANEL'S FLEX GAP between the two halves.
   .aieo-modules-panel is display:flex and .aieo-dmm-modules-panel adds
   gap:20px, so every DIRECT child is pushed 20px from the next — including a
   heading and the description meant to sit flush against it. That gap belongs
   to the parent, so no margin on the children can remove it; it has to be
   pulled back by exactly the same amount. This is what left a visible hole in
   the middle of the Events and Competitions intro cards.
   Applies ONLY to the direct-child case. An intro inside a plain wrapper
   (#aieo-food-root) has no flex parent and needs no correction — which is why
   Food & Beverages was the one that already looked right. */
.aieo-dmm-modules-panel > h2 + p.description,
.aieo-dmm-modules-panel > .rooster-admin-board > h2 + p.description {
    margin-top: -20px;
}

/* An auto-wrapped module (see page.php) holds an ENTIRE screen — heading,
   description, form tables, buttons — not the tight cluster a hand-authored
   .aieo-dmm-section was designed around. The 14px flex gap that suits three
   sibling elements becomes noise across twenty, so spacing is left to the
   elements' own margins here. */
.aieo-dmm-section--auto { display: block; padding: 20px 22px; }
.aieo-dmm-section--auto > h2:first-child { margin-top: 0; }
.aieo-dmm-section--auto > h3:first-child { margin-top: 0; }
/* Its own children must not be re-carded by the intro rule — they are already
   inside a card. */
.aieo-dmm-section--auto h2 { background: none; border: 0; padding: 0; margin: 0 0 4px; }
.aieo-dmm-section--auto h2 + p.description { background: none; border: 0; padding: 0;
	margin: 0 0 14px !important; }

/* Styling-neutral marker: a .aieo-dmm-section that is deliberately NOT a titled
   content section — a cross-reference pointer, a "module not loaded" state, or a
   status banner. It keeps the section card look on purpose; the modifier exists
   so the section census and the navigator can tell a section that owes a title
   and an anchor id from one that never will. Every .aieo-dmm-section without
   --note or --auto must carry an <h2> and an id. */
.aieo-dmm-section--note {
    /* Keeps the section's place in the flow but not its weight. At full section
       chrome (24px padding + shadow + 12px radius) a one-line cross-reference
       read as a peer of real content — a sentence like "Looking for segments?
       They live under Customer Intelligence" occupied as much of the page as a
       whole settings panel. */
    padding: 12px 16px;
    gap: 8px;
    box-shadow: none;
    border: 1px solid var(--aieo-border, #e5e7eb);
    border-radius: 8px;
}

.aieo-dmm-section--note > p {
    margin: 0;
}

.aieo-dmm-section--bare {
    /* For a note whose only child is already a card. .aieo-dmm-card brings its
       own 18px padding, border and radius, so the section's 24px on top gave the
       web-push status banner 42px of combined padding inside two nested frames.
       Let the inner card be the chrome. */
    padding: 0;
    border: 0;
    background: none;
    box-shadow: none;
}

/* RTL: leftward overflow IS scrollable in a right-to-left document, so the
   off-screen park above would create the very scrollbar it removes in LTR.
   Revert to the original behaviour there. */

/* --------------------------------------------------------------------------
 *  Search in the sticky bar
 *  Placed AFTER the .aieo-dmm-subtab rules on purpose: it shares their
 *  specificity, so sitting above them let the pill's grey border and weight
 *  win and the button came out looking broken next to the menu pills.
 *  Scoped to the bar for one more point of specificity, so order alone is
 *  never what is holding it together.
 * ----------------------------------------------------------------------- */

/* The AI icon takes the auto margin, so search no longer needs it: the two
   travel together as a pair at the right-hand end. */

/* A phone has no Ctrl+K to press. */

/* Filtered Home: the chip states which group you are looking at and the link
   is the way back. Wears the group's own accent, same as its sidebar entry and
   its pill, so the three agree about where you are. */

/* BOTH controls are pills, and they share this block so they cannot drift apart.
   The way back used to be bare link text beside a solid pill, which read as an
   afterthought rather than the other half of a pair. Same height, radius, type
   and padding; only the fill differs. */

/* Where you are: the group's accent, filled. */

/* The way out: the same pill inverted — white fill, the group's colour as both
   border and letters. Letters take --aieo-group-ink, not the raw accent: ink IS
   the accent for twelve of the thirteen groups, but Set Up's amber (#FEAC03) is
   unreadable as text on white and already carries a darkened override for
   exactly this. The border keeps the true accent, so the pair still states the
   group's real colour. */

/* wp-admin styles every `a:focus` with a BLUE ring (box-shadow 0 0 0 1px #4f94d4
   plus a soft outer glow) and a blue text colour. On a pill whose whole point is
   to wear its group's colour, a click turned the border blue. Clearing it is not
   enough on its own — a control with no focus state is unusable by keyboard — so
   the ring is replaced rather than removed.
   :focus covers the mouse case (no ring, colours preserved); :focus-visible adds
   the ring back for keyboard users only, in the group's own accent. */

/* Return column: the label link and the voucher block.
   The column was three grey lines and a pill; the one thing an operator needs
   at this stage — open the document and look at it — was not there at all. */
.aieo-wd-sum { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; }
/* Caption above the number, not beside it: "ΔΕΛΤΙΟ ΕΠΙΣΤΡΟΦΗΣ" is a label for
   the code, and on one line the two competed for the same reading. */
.aieo-wd-sum__id { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; }
.aieo-wd-sum__no { font-size: 12px; padding: 1px 6px; border-radius: 4px; background: var(--aieo-muted, #f0f0f1); }
.aieo-wd-sum__lbl { display: inline-flex; align-items: center; gap: 5px; font-size: 12px;
    font-weight: 600; text-decoration: none; }
.aieo-wd-sum__lbl::before { content: "\1F4C4"; font-weight: 400; }
.aieo-wd-sum__lbl:hover { text-decoration: underline; }

/* Actions column: the two buttons are one decision, so they are one shape.
   They were content-sized and different heights — the secondary is .button-small
   and the primary is not — so a column of them read as a ragged stack rather
   than as "review it, then approve it". Same width, same height, stacked; the
   longer Greek label wraps inside the box instead of stretching it. */
/* `.button` is in each selector on purpose: it lifts these to (0,3,0) so they
   beat wp-admin's own `.wp-core-ui .button-small` (0,2,0), which carries its own
   min-height and line-height and was quietly winning the height even after the
   widths matched. Height is stated, not left to padding + line-height, which is
   what let the two drift apart in the first place. */
.aieo-wd-queue .aieo-wd-toggle.button,
.aieo-wd-queue .aieo-wd-ret[data-mode="approve"].button {
    box-sizing: border-box;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    max-width: 240px;
    height: auto;
    min-height: 40px;
    margin: 0 0 6px;
    padding: 6px 12px;
    line-height: 1.35;
    font-size: 13px;
    white-space: normal;
    text-align: center;
}
/* .button-primary sets its own padding and line-height, and it is the reason the
   filled button came out taller than the outlined one even with a shared
   min-height. Restated here so both boxes are the same object. */
.aieo-wd-queue .aieo-wd-ret[data-mode="approve"].button.button-primary {
    padding: 6px 12px;
    line-height: 1.35;
    min-height: 40px;
    height: auto;
}

/* Label upload row: courier, file, button — one control in three parts, so one
   height. They were three different heights because a <select>, a file input and
   a .button each size themselves their own way, and the row read as three
   unrelated widgets rather than one action. The file input gets the same border
   and radius as the select for the same reason; browsers style it as bare text
   otherwise, so it looked like a caption that had wandered between two fields. */
.aieo-wd-upl-carrier,
.aieo-wd-label-file,
.aieo-wd-ret[data-mode="upload"] {
    box-sizing: border-box;
    height: 36px;
    margin: 0 6px 6px 0;
    vertical-align: middle;
    font-size: 13px;
}
.aieo-wd-upl-carrier { padding: 0 26px 0 8px; }
.aieo-wd-label-file {
    padding: 6px 8px;
    border: 1px solid var(--aieo-input, #c3c4c7);
    border-radius: 4px;
    background: var(--aieo-card, #fff);
    max-width: 300px;
}
.aieo-wd-ret[data-mode="upload"] { display: inline-flex; align-items: center; justify-content: center; }

/* Return column, final pass.
   Grey and iconless: it is a utility link sitting under a coloured state tag, so
   wp-admin's blue made it the loudest thing in a column whose whole job is to be
   scanned, and the page glyph was a third mark in a cell that already carries a
   code chip and a tag. Plain text that behaves like a link.
   And everything starts at the same left edge — the chip, the tags and the link
   each brought their own centring habits, so the stack read ragged under a
   flush-left caption. */
.aieo-wd-sum__lbl::before { content: none !important; }
.aieo-wd-sum__lbl {
    display: inline-block;
    gap: 0;
    color: var(--aieo-tone-secondary, #50575e);
    text-decoration: none;
}
.aieo-wd-sum__lbl:hover,
.aieo-wd-sum__lbl:focus {
    color: var(--aieo-foreground, #1d2327);
    text-decoration: underline;
    box-shadow: none;
    outline: none;
}
.aieo-wd-sum,
.aieo-wd-sum > *,
.aieo-wd-sum__id,
.aieo-wd-sum__id > * {
    text-align: left;
    align-self: flex-start;
    margin-left: 0;
}

/* Who did it lives in the date's title attribute, not in the flow — a block under
   the date grew a blank line opposite it in the label column, which read as a gap
   between steps. The cursor change is the only hint it needs. */
.aieo-wd-hist__d[title] { cursor: help; }
/* No blank rows in the progress list: every line is a step, and anything that is
   not one should not occupy a line. */
.aieo-wd-hist li:empty { display: none; }
.aieo-wd-hist li { margin: 0 0 2px; }

/* EVERY button in the actions column, on every tab. I had been naming them one
   pair at a time — the approve pair, then the label/received pair — and each tab
   surfaced another pair I had not covered. They all sit inside .aieo-wd-actions,
   so scope it there once and the problem stops recurring.
   Three class names deep (0,3,0) so it beats wp-admin's own .wp-core-ui
   .button-small (0,2,0), which carries the min-height and line-height that kept
   winning. Height is stated rather than left to emerge from padding, which is
   what let them drift apart in the first place. */
.aieo-wd-queue .aieo-wd-actions .button,
.aieo-wd-queue .aieo-wd-actions a.button {
    box-sizing: border-box;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    max-width: 240px;
    height: auto;
    min-height: 40px;
    margin: 0 0 6px;
    padding: 6px 12px;
    line-height: 1.35;
    font-size: 13px;
    white-space: normal;
    text-align: center;
    text-decoration: none;
}

/* ==========================================================================
   CARD PINS — a pin on every addressable card, at the right of its title.
   Injected by assets/js/aieo-cardpin.js; see that file for why the server
   declares what is pinnable and the DOM decides what is on screen.

   THE CLASS PREFIX IS `aieo-cardpin`, NOT `aieo-card-pin`. `aieo-card-*` is
   already a STOREFRONT class family in the side cart (.aieo-card-name,
   .aieo-card-price), and several of those files sit in the 68-file
   byte-identical parity set shared with the runtime plugin. A near-miss there
   is a class that silently styles the wrong thing on a customer's screen.
   ========================================================================== */

/* THE HEADING ITSELF IS THE FLEX CONTAINER, and never a wrapper around it.
 *
 * dmm.css styles section titles with DIRECT-child selectors
 * (`.aieo-dmm-section > h2`, `.aieo-dmm-section > .aieo-dmm-card > h2`), so
 * inserting a <div> to hold the title and the button would unstyle 191 section
 * headings at once and read as a CSS regression nobody would connect to pins.
 *
 * Making the h2/h3 the container costs nothing and buys the exact centring that
 * was asked for. The wrapping title text becomes a single ANONYMOUS FLEX ITEM
 * spanning all its lines, so `align-items: center` puts the pin at the vertical
 * midpoint of the whole title block: a three-line title sits it level with line
 * two. There is no JS in that, and nothing to recompute on resize.
 *
 * `margin-inline-start`, not `margin-left`, so RTL is correct for free. */
/* ELEMENT-QUALIFIED ON PURPOSE, and it is not decoration.
 *
 * `.aieo-dmm-section > h2` above already declares `display:flex;
 * align-items:baseline` and scores 0-1-1. A bare `.aieo-cardpin-host` scores
 * 0-1-0 and would simply lose — the pin would sit on the title's BASELINE, which
 * on a three-line heading puts it level with the last line rather than the
 * middle one, i.e. the one thing the operator asked for by name. Qualifying by
 * tag ties the specificity, and being later in the file wins the tie. */

/* `.aieo-dmm-section > h2` is already `display:flex; align-items:baseline`, so
   there only align-items is being overridden; `.aieo-dmm-card h3` is not flex
   at all and takes the whole rule from here. 51 cards already put a button to
   the right of their title in a flex row, so this is the established pattern
   rather than a new one. */

/* THE TAB VARIANT — one control at the END of the strip, pinning the tab you
   are on. It is NOT interleaved with the tabs: `.nav-tab` is an inline-block
   sitting on the wrapper's bottom border, and any inline element between two
   of them knocks every following tab off that baseline, rendering the strip as
   a staircase. Tried it; it is not tunable, the alignment depends on the tabs
   being adjacent. Hence a single trailing host.

   `vertical-align: bottom` puts it on the tabs' own baseline rather than the
   text baseline, and the bottom margin lifts it clear of the 1px rule the tabs
   sit on. */

/* It inherits none of the heading-host rules above — `margin-inline-start:
   auto` would shove it to the far end of a flex heading, and `align-self`
   means nothing outside one. */

/* Planted, not lying on its side: the tilt is what reads as "not yet pinned".
   Same treatment as the Home grid's star, so the two controls that do the same
   thing look like the same thing. */

/* NO ROW OF GHOST BUTTONS ON A TOUCH SCREEN. Hover cannot resolve them there,
   so on a coarse pointer they simply start at their resting weight. */
/* The deep-link target takes focus so a keyboard user lands ON the card rather
   than at the top of the document — but tabindex="-1" draws wp-admin's focus
   ring around a whole panel, which reads as an error state. The highlight pulse
   is already saying "here"; this is the same statement twice. */
[id^="aieo-card-"]:focus { outline: none; }
[id^="aieo-card-"]:focus-visible { outline: 2px solid var(--aieo-primary, #2271b1); outline-offset: 2px; }

/* A CARD CHIP IS VISIBLY A CARD CHIP.
 *
 * Text alone could not carry this. The operator pinned the Orders Export PAGE
 * and the "Orders export" CARD inside it, and got two chips differing only in
 * one capital letter — nothing on screen said one was a page and the other a
 * place inside it. Appending the page name fixes the reading; this fixes the
 * glance. A left inset rule, in the chip's own group accent, so it reads as
 * "indented under something" rather than as decoration. */

/* A DESCRIPTION KEEPS ITS TYPOGRAPHY WHEN IT MOVES INTO A CARD.
 *
 * `.aieo-dmm-section > p.description` is a DIRECT-child rule, so anchoring a
 * sub-section — which means wrapping its heading and its body in an
 * `.aieo-dmm-card` — pushed those paragraphs one level down and they matched
 * nothing at all: no colour, no line-height, falling back to the admin default.
 * Found on the price-history report card, and it applies to every card added by
 * the homogenisation pass.
 *
 * ⚠ TYPOGRAPHY ONLY. Deliberately no `display`, because this selector scores
 * (0,2,1) and would beat `.aieo-dmm-form .description` at (0,2,0) — which is
 * exactly the specificity mistake that turned 28 descriptions into flex columns
 * and broke sentences containing inline <code> onto separate lines. Setting only
 * colour, size and rhythm cannot resurrect that. */
.aieo-dmm-card > p.description {
    color: #676f78;
    font-size: 13px;
    line-height: 1.55;
    margin: 0;
}

/* ─────────────────────────────────────────────────────────────────────────────
 * Rules the scripts used to inject at run time (D4, 11.2.5): they live here now, one stylesheet, no <style> from JS.
 * On a chrome screen the admin chrome's aliases outweigh them (the pick field, the chips, the modal); on core's
 * screens (the competition and event editors) they are the look.
 * ──────────────────────────────────────────────────────────────────────────── */

/* The product picker's modal and chips (dmm-product-picker.js: injected by the script until D4) */











.aieo-pm-overlay {
    position:fixed;
    inset:0;
    z-index:100000;
    background:rgba(0,0,0,.30);
    -webkit-backdrop-filter:blur(4px);
    backdrop-filter:blur(4px);
    display:flex;
    align-items:center;
    justify-content:center;
    padding:16px;
}
.aieo-pm-card {
    background:var(--aieo-card,#fff);
    color:var(--aieo-card-fg,#09090b);
    border:1px solid var(--aieo-border,#ececee);
    border-radius:var(--aieo-radius-lg,8px);
    box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);
    width:min(660px,100%);
    height:min(86vh,760px);
    display:flex;
    flex-direction:column;
    overflow:hidden;
}
.aieo-pm-head {
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:8px;
    padding:16px 20px;
    border-bottom:1px solid var(--aieo-border,#ececee);
}
.aieo-pm-head h3 {
    margin:0;
    font-size:16px;
    font-weight:600;
    line-height:1.4;
    color:var(--aieo-mono,#09090b);
}
.aieo-pm-close {
    cursor:pointer;
    border:0;
    background:none;
    width:24px;
    height:24px;
    padding:0;
    font-size:20px;
    line-height:1;
    color:var(--aieo-foreground,#09090b);
    opacity:.7;
}
.aieo-pm-close:hover,.aieo-pm-close:focus {
    opacity:1;
}
.aieo-pm-search {
    padding:16px 20px;
    border-bottom:1px solid var(--aieo-border,#ececee);
}
.aieo-pm-search input,.wp-core-ui .aieo-pm-search input[type="text"],.wp-core-ui .aieo-pm-search input[type="search"] {
    box-sizing:border-box;
    width:100%;
    height:34px;
    min-height:34px;
    padding:0 12px;
    font-size:var(--aieo-text-sm,13px);
    line-height:1.5;
    color:var(--aieo-foreground,#09090b);
    background:var(--aieo-background,#fff);
    border:1px solid var(--aieo-input,#e4e4e7);
    border-radius:var(--aieo-radius-md,6px);
    box-shadow:0 1px 1px rgba(0,0,0,.05);
    transition:color .15s,box-shadow .15s,border-color .15s;
}
.aieo-pm-search input:focus,.wp-core-ui .aieo-pm-search input[type="text"]:focus,.wp-core-ui .aieo-pm-search input[type="search"]:focus {
    outline:none;
    border-color:var(--aieo-ring,#a1a1aa);
    box-shadow:0 0 0 3px rgba(161,161,170,.3);
}
.aieo-pm-results {
    overflow-y:auto;
    padding:8px 12px;
    flex:1;
    min-height:180px;
}
.aieo-pm-row {
    border-bottom:1px solid var(--aieo-border,#ececee);
}
.aieo-pm-row:last-child {
    border-bottom:0;
}
.aieo-pm-line {
    display:flex;
    align-items:center;
    gap:8px;
    padding:8px 8px;
    border-radius:var(--aieo-radius-md,6px);
}
.aieo-pm-row:hover>.aieo-pm-line {
    background:var(--aieo-row-hover,#fafafa);
}
.aieo-pm-line label {
    display:flex;
    align-items:center;
    gap:10px;
    margin:0;
    flex:1;
    cursor:pointer;
    font-size:var(--aieo-text-base,14px);
}
.aieo-pm-cb,.aieo-pm-vrow input[type="checkbox"] {
    accent-color:var(--aieo-primary,#3b82f6);
    width:16px;
    height:16px;
    margin:0;
    flex:none;
}
.aieo-pm-row.is-grey>.aieo-pm-line label>span:first-of-type {
    color:var(--aieo-muted-fg,#71717a);
}
.aieo-pm-caret {
    cursor:pointer;
    width:18px;
    text-align:center;
    color:var(--aieo-muted-fg,#71717a);
    user-select:none;
    font-size:11px;
}
.aieo-pm-caret.is-spacer {
    visibility:hidden;
    cursor:default;
}
.aieo-pm-badge {
    font-size:var(--aieo-text-2xs,11px);
    text-transform:uppercase;
    letter-spacing:.03em;
    border-radius:var(--aieo-radius-sm,4px);
    padding:1px 6px;
    background:var(--aieo-secondary-soft,#f4f4f5);
    color:var(--aieo-secondary-soft-fg,#3f3f46);
    white-space:nowrap;
}
.aieo-pm-badge.var {
    background:var(--aieo-primary-soft,#dbeafe);
    color:var(--aieo-primary-soft-fg,#1e40af);
}
.aieo-pm-badge.draft {
    background:var(--aieo-warning-soft,#fef9c3);
    color:var(--aieo-warning-soft-fg,#854d0e);
}
.aieo-pm-vars {
    padding:0 8px 8px 40px;
}
.aieo-pm-vrow {
    display:flex;
    align-items:center;
    gap:8px;
    padding:6px 4px;
}
.aieo-pm-vrow label {
    display:flex;
    align-items:center;
    gap:10px;
    margin:0;
    cursor:pointer;
    font-size:var(--aieo-text-sm,13px);
}
.aieo-pm-foot {
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:8px;
    padding:16px 20px;
    border-top:1px solid var(--aieo-border,#ececee);
    background:var(--aieo-muted,#f4f4f5);
}
.aieo-pm-count {
    font-size:var(--aieo-text-sm,13px);
    color:var(--aieo-muted-fg,#71717a);
}
.aieo-pm-muted {
    color:var(--aieo-muted-fg,#71717a);
    font-size:var(--aieo-text-sm,13px);
    padding:16px 10px;
}

/* The value picker's control and modal (aieo-value-picker.js: injected by the script until D4) */
.aieo-valpick {
    display:inline-flex;
    flex-direction:column;
    gap:4px;
    min-width:200px;
    vertical-align:bottom;
}
.aieo-valpick-open {
    display:block;
    width:100%;
    min-height:30px;
    text-align:left;
    overflow:hidden;
    text-overflow:ellipsis;
    white-space:nowrap;
}
.aieo-valpick-chips {
    display:flex;
    flex-wrap:wrap;
    gap:5px;
    max-height:104px;
    overflow:auto;
}
.aieo-valpick-chips:empty {
    display:none;
}
.aieo-valpick-chips .aieo-vchip {
    display:inline-flex;
    align-items:center;
    gap:6px;
    background:var(--aieo-group-accent,#e7156b);
    color:var(--aieo-group-fg,#fff);
    border-radius:var(--aieo-radius-pill,999px);
    padding:3px 10px;
    font-size:var(--aieo-text-xs,12px);
    line-height:1.5;
    max-width:100%;
}
.aieo-valpick-chips .aieo-vchip-t {
    overflow:hidden;
    text-overflow:ellipsis;
    white-space:nowrap;
    max-width:240px;
}
.aieo-valpick-chips .aieo-vchip-x {
    cursor:pointer;
    font-weight:700;
    opacity:.7;
}
.aieo-valpick-chips .aieo-vchip-x:hover {
    opacity:1;
}
.aieo-vm-overlay {
    position:fixed;
    inset:0;
    z-index:100001;
    background:rgba(0,0,0,.30);
    -webkit-backdrop-filter:blur(4px);
    backdrop-filter:blur(4px);
    display:flex;
    align-items:center;
    justify-content:center;
    padding:16px;
}
.aieo-vm-card {
    background:var(--aieo-card,#fff);
    color:var(--aieo-card-fg,#09090b);
    border:1px solid var(--aieo-border,#ececee);
    border-radius:var(--aieo-radius-lg,8px);
    box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);
    width:min(560px,100%);
    height:min(80vh,680px);
    display:flex;
    flex-direction:column;
    overflow:hidden;
}
.aieo-vm-head {
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:8px;
    padding:16px 20px;
    border-bottom:1px solid var(--aieo-border,#ececee);
}
.aieo-vm-head h3 {
    margin:0;
    font-size:16px;
    font-weight:600;
    line-height:1.4;
    color:var(--aieo-mono,#09090b);
}
.aieo-vm-close {
    cursor:pointer;
    border:0;
    background:none;
    width:24px;
    height:24px;
    padding:0;
    font-size:20px;
    line-height:1;
    color:var(--aieo-foreground,#09090b);
    opacity:.7;
}
.aieo-vm-close:hover,.aieo-vm-close:focus {
    opacity:1;
}
.aieo-vm-search {
    padding:16px 20px;
    border-bottom:1px solid var(--aieo-border,#ececee);
}
.aieo-vm-search input,.wp-core-ui .aieo-vm-search input[type="text"],.wp-core-ui .aieo-vm-search input[type="search"] {
    box-sizing:border-box;
    width:100%;
    height:34px;
    min-height:34px;
    padding:0 12px;
    font-size:var(--aieo-text-sm,13px);
    line-height:1.5;
    color:var(--aieo-foreground,#09090b);
    background:var(--aieo-background,#fff);
    border:1px solid var(--aieo-input,#e4e4e7);
    border-radius:var(--aieo-radius-md,6px);
    box-shadow:0 1px 1px rgba(0,0,0,.05);
    transition:color .15s,box-shadow .15s,border-color .15s;
}
.aieo-vm-search input:focus,.wp-core-ui .aieo-vm-search input[type="text"]:focus,.wp-core-ui .aieo-vm-search input[type="search"]:focus {
    outline:none;
    border-color:var(--aieo-ring,#a1a1aa);
    box-shadow:0 0 0 3px rgba(161,161,170,.3);
}
.aieo-vm-tools {
    display:flex;
    gap:14px;
    padding:10px 20px 0;
}
.aieo-vm-tools a {
    font-size:var(--aieo-text-xs,12px);
    cursor:pointer;
    color:var(--aieo-muted-fg,#71717a);
    text-decoration:none;
}
.aieo-vm-tools a:hover {
    color:var(--aieo-foreground,#09090b);
    text-decoration:underline;
}
.aieo-vm-results {
    overflow-y:auto;
    padding:8px 12px;
    flex:1;
    min-height:160px;
}
.aieo-vm-row {
    display:flex;
    align-items:center;
    gap:8px;
    padding:8px 8px;
    border-radius:var(--aieo-radius-md,6px);
    border-bottom:1px solid var(--aieo-border,#ececee);
}
.aieo-vm-row:last-child {
    border-bottom:0;
}
.aieo-vm-row:hover {
    background:var(--aieo-row-hover,#fafafa);
}
.aieo-vm-row label {
    display:flex;
    align-items:center;
    gap:10px;
    margin:0;
    flex:1;
    cursor:pointer;
    font-size:var(--aieo-text-base,14px);
}
.aieo-vm-cb {
    accent-color:var(--aieo-primary,#3b82f6);
    width:16px;
    height:16px;
    margin:0;
    flex:none;
}
.aieo-vm-foot {
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:8px;
    padding:16px 20px;
    border-top:1px solid var(--aieo-border,#ececee);
    background:var(--aieo-muted,#f4f4f5);
}
.aieo-vm-count {
    font-size:var(--aieo-text-sm,13px);
    color:var(--aieo-muted-fg,#71717a);
}
.aieo-vm-muted {
    color:var(--aieo-muted-fg,#71717a);
    font-size:var(--aieo-text-sm,13px);
    padding:16px 10px;
}

/* The marketplace feeds page's rule fields and chips (marketplace-feeds.php: injected by its script until D4; its copy of the picker modal's rules dropped for the product picker's) */
.aieo-feed-rules {
    grid-template-columns:repeat(2,minmax(0,1fr)) !important;
}
.aieo-feed-rules>p,.aieo-feed-rules>.aieo-feed-rule {
    min-width:0;
}
.aieo-feed-rule {
    display:flex;
    flex-direction:column;
    gap:4px;
    margin:0 0 6px;
}
.aieo-feed-rule>label {
    margin-bottom:0;
    font-weight:600;
}
.aieo-feed-rules>.aieo-feed-rule-full {
    grid-column:1 / -1;
}
@media (max-width:782px) {
    .aieo-feed-rules {
    grid-template-columns:minmax(0,1fr) !important;
}
.aieo-feed-chips {
    display:flex;
    flex-wrap:wrap;
    gap:6px;
    margin:0 0 8px;
    max-height:230px;
    overflow:auto;
    align-content:flex-start;
}
.aieo-feed-chips .aieo-chip {
    display:inline-flex;
    align-items:center;
    gap:6px;
    background:#e7156b;
    color: var(--aieo-primary-fg, #fff);
    border-radius:14px;
    padding:3px 10px;
    font-size:12px;
    line-height:1.5;
    max-width:100%;
}
.aieo-feed-chips .aieo-chip.is-grey {
    background: var(--aieo-border, #dcdcde);
    color: var(--aieo-tone-secondary, #50575e);
}
.aieo-feed-chips .aieo-chip.is-var {
    background: var(--aieo-primary, #2271b1);
}
.aieo-feed-chips .aieo-chip.is-var.is-grey {
    background:#c7d2da;
    color: var(--aieo-tone-secondary, #3c434a);
}
.aieo-feed-chips .aieo-chip-x {
    cursor:pointer;
    font-weight:700;
    opacity:.85;
}
.aieo-feed-chips .aieo-chip-x:hover {
    opacity:1;
}
.aieo-feed-chips .aieo-chip-t {
    overflow:hidden;
    text-overflow:ellipsis;
    white-space:nowrap;
    max-width:340px;
}
.aieo-feed-empty {
    color: var(--aieo-muted-fg, #787c82);
    font-size:12px;
    font-style:italic;
}}
/* Semantic linking screens: the markup carries classes, not styles. */
.aieo-sem-tone { font-weight: 600; }
.aieo-sem-tone--strong { color: var(--ra-success-foreground, #166534); }
.aieo-sem-tone--good { color: var(--ra-success-foreground, #166534); }
.aieo-sem-tone--weak { color: var(--ra-warning-soft-foreground, #b45309); }
.aieo-sem-tone--bad { color: var(--ra-destructive, #b91c1c); }
.aieo-sem-caution { color: var(--ra-warning-soft-foreground, #8a6d3b); }
.aieo-sem-list { margin: 4px 0 0 18px; list-style: disc; }
.aieo-sem-tinted { background: var(--ra-muted, #fbfbfc); }
.aieo-sem-off { opacity: .55; }
.aieo-sem-field { display: block; margin: 12px 0 6px; }
div.aieo-sem-field { margin: 10px 0 6px; }
.aieo-sem-tt-schemes { display: flex; gap: 32px; flex-wrap: wrap; }
/* The tooltip preview reads the storefront's variables (aieo-semantic-tooltips.css), light scheme, with its defaults;
   the settings script sets them on #aieo-tt-preview from the pickers, in a <style> of its own. */
.aieo-sem-tt-preview { border-radius: 6px; padding: 12px 14px; font-size: 14px; line-height: 1.5; max-width: var(--aieo-tt-max-width, 380px); border: 1px solid var(--aieo-tt-border, rgba(0, 0, 0, .12)); background: var(--aieo-tt-bg, #fff); color: var(--aieo-tt-text, #1f2937); }
.aieo-sem-tt-preview a { color: var(--aieo-tt-link, #1d4ed8); }
.aieo-sem-search { position: relative; display: inline-block; min-width: 420px; }
.aieo-sem-search--block { display: block; min-width: 0; }
.aieo-sem-search > input[type="search"] { width: 100%; }
.aieo-sem-search__results { position: absolute; z-index: 20; left: 0; right: 0; background: var(--ra-card, #fff); border: 1px solid var(--ra-border, #c3c4c7); border-top: 0; max-height: 320px; overflow: auto; }
.aieo-sem-search__results[hidden] { display: none; }
.aieo-sem-search__results--rule { max-width: 20rem; max-height: 220px; border-top: 1px solid var(--ra-border, #dcdcde); }
.aieo-sem-search__hit { display: block; width: 100%; padding: 7px 10px; text-align: left; text-decoration: none; border-bottom: 1px solid var(--ra-border, #f0f0f1); color: inherit; }
.aieo-sem-search__none { padding: 8px 10px; color: var(--ra-secondary-foreground, #64748b); }
.aieo-sem-search__meta { color: var(--ra-secondary-foreground, #64748b); font-size: var(--ra-text-xs, 11px); }
.aieo-sem-modal-foot { margin-bottom: 0; text-align: right; }
.aieo-sem-bucket { margin: 10px 0 4px; font-weight: 600; }
.aieo-sem-bucket--good { color: var(--ra-success-foreground, #166534); }
.aieo-sem-bucket--muted { color: var(--ra-secondary-foreground, #64748b); }
.aieo-sem-bucket--warn { color: var(--ra-warning-soft-foreground, #b45309); }

/* Withdrawal settings: the cancellable statuses and the refusal grounds. */
.aieo-wd-status-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 4px 14px; max-width: 900px; }
.aieo-wd-ground { margin: 0 0 6px; display: flex; gap: 8px; align-items: flex-start; }
.aieo-wd-ground__text { flex: 1; min-width: 0; }

/* Price history, contact form, local pickup, payment gating, competitions, captcha. */
.aieo-ph-note { margin: 0; }
.aieo-ph-note--after { margin-top: 8px; }
.aieo-muted-inline { color: var(--ra-secondary-foreground, #666); }
.aieo-lp-countries { padding: 0; border: 0; columns: 220px 3; max-width: 760px; }
.aieo-pg-locs { margin: 0 0 0 22px; padding: 0; border: 0; }
.aieo-pg-locs.is-off { opacity: .5; }
.aieo-comp-image-field { flex: 1; min-width: 200px; }
.aieo-cap-status { margin: 0 0 6px; }
.aieo-cap-status__tone { font-weight: 600; }
.aieo-cap-status__tone--wait { color: var(--ra-warning-soft-foreground, #996800); }
.aieo-cap-status__tone--ok { color: var(--ra-success-foreground, #15803d); }
.aieo-cap-status__tone--bad { color: var(--ra-destructive, #b32d2e); }
.aieo-cap-caution { color: var(--ra-warning-soft-foreground, #996800); }
.aieo-cap-caution--block { margin-top: 8px; }

/* Markup round (R3): duplicate simples, by hand. The search row is the library's .rooster-admin-row; the results and the basket sit side by side as sub-cards. */
.aieo-ds-find { margin: 12px 0; }
.aieo-ds-split { display: flex; gap: 18px; flex-wrap: wrap; align-items: flex-start; }
.aieo-ds-split__results { flex: 1 1 460px; min-width: 320px; }
.aieo-ds-split__basket { flex: 0 1 340px; min-width: 280px; }
.aieo-ds-basket { margin: 0 0 10px; padding: 0; list-style: none; }
.aieo-ds-msg { margin: 0; }
.aieo-ds-msg--ok { color: var(--ra-success-foreground, #166534); font-weight: 600; }
.aieo-ds-msg--error { color: var(--ra-destructive-foreground, #991b1b); }

/* Markup round (R3): Tools (documentation coverage, the look-up results). */
.aieo-tools-note { margin: 0 0 10px; font-size: 12px; color: var(--ra-muted-foreground, #50575e); }
.aieo-tools-note--faint { color: var(--ra-secondary-foreground, #8a8f94); }
.aieo-tools-subhead { margin: 0 0 4px; font-size: 13px; font-weight: 600; }
.aieo-tools-stale { margin: 0 0 10px 18px; list-style: disc; font-size: 12px; }
.aieo-tools-body { position: relative; }
.aieo-tools-results { margin-top: 12px; }
.aieo-tools-found { margin: 0 0 12px; padding: 8px 10px; }
.aieo-tools-lab { margin: 0 0 4px; }
.aieo-tools-lab--next { margin-top: 10px; }
.aieo-tools-notfound { color: var(--ra-destructive-foreground, #b91c1c); }

/* Markup round (R3): header icons: the Custom box beside its colour field. */
.aieo-ha-custom { margin-right: 10px; }

/* Markup round (R3): consent: the logo's buttons and preview, the cookie inventory's cells. */
.aieo-cmp-logo-actions { margin: 8px 0 0; }
.aieo-cmp-logo-preview { max-height: 46px; margin-top: 8px; }
.aieo-cmp-inv-desc { font-size: 12px; color: var(--ra-muted-foreground, #6b7280); }
.aieo-cmp-inv-service { width: 140px; }

/* Markup round (R3): supplier orders (status line), role pricing (the Gravity Forms map, hidden in this release). */
.aieo-so-status { margin-left: 8px; font-weight: 600; }
.aieo-rp-warn { color: var(--ra-warning-soft-foreground, #b45309); }
.aieo-rp-gfmap { max-width: 560px; }
.aieo-rp-gfmap__val { width: 120px; }

/* Markup round (R3): newsletter signup (the shortcode, the group headings, the image thumbnails, the privacy fields). */
.aieo-promo-shortcode { user-select: all; }
.aieo-nl-group { margin: 0; font-size: 13px; font-weight: 600; }
.aieo-nl-thumb { max-height: 32px; vertical-align: middle; }
.aieo-nl-thumb--logo { max-height: 40px; }
.aieo-nl-thumb[hidden] { display: none; }
.aieo-nl-inline-label { margin-left: 10px; }
.aieo-nl-stacked { margin-top: 6px; }

/* Markup round R4 (27 Oct 2026): the screens' former inline styles, as classes (product exchanger, product display, chat settings, orders analytics, ads, connections, web push, button styles, google reviews, side cart, questionnaire results). */
.aieo-tone-ok{color:#15803d}
.aieo-tone-error{color:#b91c1c}
.aieo-tone-warn{color:#8a6d3b}
.aieo-tone-off{color:#9ca3af}
.aieo-tone-info{color:#2563eb}
.aieo-tone-muted{color:#646970}
.aieo-tone-strong{color:#374151}
.aieo-tone-bold{font-weight:600}
.aieo-flush{margin:0}
.aieo-mono-field{font-family:monospace;font-size:11px;max-width:100%}
.aieo-exch-token-input{width:100%;max-width:520px;margin:4px 0}
.aieo-exch-newtoken{width:32em}
.aieo-status-line{margin:8px 0 0;font-size:13px}
.aieo-save-status{margin-left:10px;font-size:13px;color:#646970}
.aieo-details-block{margin:12px 0}
.aieo-details-block>.aieo-dmm-grid{margin-top:8px}
.aieo-details-summary{cursor:pointer;font-weight:600}
.aieo-choice-spaced{margin-right:14px}
.aieo-media-progress{max-width:520px}
.aieo-media-progress progress{width:100%;height:14px}
.aieo-media-progress .description{margin:4px 0 0}
#aieo-exch-media-cancel[hidden]{display:none}
.aieo-media-files{margin:0 0 12px}
.aieo-media-files li{margin-bottom:6px}
.aieo-media-link-row{margin:4px 0}
.aieo-media-link-row .aieo-exch-media-link{width:100%;max-width:720px}
.aieo-code-wrap{white-space:normal;line-height:1.9}
.aieo-desc-flush{margin-top:0}
.aieo-text-warn{color:#b45309}
.aieo-text-error{color:#b91c1c}
.aieo-mono-pre{margin:0;white-space:pre-wrap;font-family:monospace;font-size:11px}
.aieo-reco-rules-table{margin:0}
.aieo-order-status{margin:10px 0 0;color:#646970;font-size:13px}
.aieo-aj-predictor-opts{margin-top:8px;display:flex;flex-direction:column;gap:6px;white-space:normal;max-width:340px}
.aieo-aj-opt-row{display:flex;align-items:center;gap:8px}
.aieo-aj-opt-row--wrap{flex-wrap:wrap}
.aieo-aj-opt-label{flex:0 0 76px;font-size:11px;color:#6b7280;white-space:nowrap}
.aieo-aj-opt-select{flex:1 1 auto;min-width:0;max-width:250px}
.aieo-aj-stale{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:#6b7280;margin-left:84px}
.aieo-aj-stale[hidden]{display:none}
.aieo-chat-text{font-size:13px}
body[class*="page_ai-eshop-chat"] small{font-size:12px}
body[class*="page_ai-eshop-chat"] em.aieo-chat-text-small{font-size:12px}
.aieo-chat-label-block{display: block; margin-bottom: 5px}
.aieo-chat-label-block--roomy{margin-bottom:6px}
.aieo-chat-weight-row{display: flex; align-items: center; gap: 12px}
.aieo-chat-weight-name{min-width: 120px; color: #374151; font-size: 14px}
.aieo-chat-weight-input{width: 80px; padding: 4px 8px}
.aieo-chat-note{color: #6b7280; font-size: 13px}
.aieo-chat-field-medium{width: 100%; max-width: 350px}
.aieo-chat-gap-bottom{margin-bottom: 10px}
.aieo-chat-gap-top{margin-top: 10px}
.aieo-chat-gap-bottom-sm{margin-bottom: 6px}
.aieo-chat-gap-bottom-lg{margin-bottom: 15px}
.aieo-chat-gap-bottom-md{margin-bottom: 8px}
.aieo-chat-section{margin-bottom: 20px}
.aieo-chat-check-plain{font-weight:400}
.aieo-chat-input-narrow{width:70px}
.aieo-chat-check-small{font-size: 13px; color: #374151; cursor: pointer}
.aieo-chat-check-box{width: 16px; height: 16px}
.aieo-chat-field-full{width: 100%}
.aieo-chat-status-gap{margin-left: 10px}
.aieo-chat-link-gap{margin-left: 5px}
.aieo-chat-tester-heading{font-weight:600;margin-bottom:4px;font-size:12px}
.aieo-chat-tester-output{background:#0f172a;color:#e2e8f0;padding:10px;border-radius:6px;overflow:auto;max-height:240px;font-size:12px;white-space:pre-wrap;word-break:break-word}
.aieo-chat-cpt-label{display: inline-block; width: 150px}
.aieo-chat-cpt-input{width: 200px}
.aieo-chat-option-help{color: #6b7280; font-size: 13px; margin-left: 24px; display: block}
.aieo-chat-subhead{margin: 0 0 12px 0; font-size: 14px; font-weight: 600; color: #374151}
.aieo-chat-subhead--tight{margin-bottom:8px}
.aieo-chat-subhead--plain{font-weight:400}
.aieo-chat-weights{display: grid; gap: 12px}
.aieo-chat-field-hint{display: block; margin-top: 3px; color: #6b7280}
.aieo-chat-field-hint--spaced{margin-top:5px}
.aieo-chat-hidden{display:none}
.aieo-chat-check-gap{margin: 0 8px 0 0}
.aieo-chat-dim{opacity: 0.8}
.aieo-chat-tester-params{display:flex;flex-wrap:wrap;gap:14px;align-items:center;margin-top:10px;font-size:13px}
.aieo-chat-tester-actions{margin-top:12px;display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.aieo-chat-tester-result{margin-top:12px}
.aieo-chat-tester-meta{display:flex;gap:18px;flex-wrap:wrap;font-size:13px;margin-bottom:8px}
.aieo-chat-tester-panes{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.aieo-chat-option-body{margin-left: 24px; margin-bottom: 15px}
.aieo-chat-option-help--flush{margin-left:0;margin-bottom:8px}
.aieo-chat-inline-row{display: flex; align-items: center; gap: 8px}
.aieo-chat-inline-label{color: #374151; font-size: 14px}
.aieo-chat-rerank-head{display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px}
.aieo-chat-inline-row--wide{gap:10px}
.aieo-chat-rerank-state{font-size: 13px; font-weight: 500}
.aieo-chat-note--flush{margin:0;line-height:1.5}
.aieo-chat-note--below{margin:0 0 8px}
.aieo-chat-code-input{width: 100%; padding: 8px; border: 1px solid #d1d5db; border-radius: 4px; font-size: 13px; font-family: monospace}
.aieo-chat-icon-inline{fill:currentColor;vertical-align:-1px;margin-right:6px}
.aieo-chat-list{margin: 0 0 0 20px; list-style: disc}
.aieo-chat-delete-type--all{background:#f9fafb;margin-bottom:6px;border-color:transparent}
.aieo-chat-delete-type{padding: 6px 8px; background: #fff; border-radius: 4px; margin-bottom: 4px; cursor: pointer; border: 2px solid #e5e7eb; transition: all 0.2s}
.aieo-chat-strong{font-weight: 600; color: #374151}
.aieo-chat-count-note{color: #9ca3af; font-weight: normal; font-size: 11px}
.aieo-chat-icon-gap{margin-right: 8px}
.aieo-chat-grow{flex: 1; font-size: 13px}
.aieo-chat-keep-data{margin-top: 20px; padding-top: 20px; border-top: 1px solid #e5e7eb}
.aieo-chat-keep-note{font-size: 12px; color: #6b7280; margin: 0 0 12px 0}
.aieo-chat-keep-list{display: flex; flex-direction: column; gap: 10px}
.aieo-chat-stat-grid{margin-top: 8px; display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px}
.aieo-chat-stat{padding: 8px; background: #F9FAFB; border-radius: 4px}
.aieo-chat-stat-label{font-size: 12px; color: #6B7280}
.aieo-chat-stat-missing{font-size: 11px; color: #9CA3AF}
.aieo-chat-stat-foot{margin-top: 10px; font-size: 11px; color: #6B7280}
.aieo-chat-icon-preview{max-width: 60px; max-height: 60px; border-radius: 4px; border: 2px solid #ddd; padding: 4px}
.aieo-chat-icon-placeholder{width: 60px; height: 60px; border: 2px dashed #ddd; border-radius: 4px; display: flex; align-items: center; justify-content: center; color: #999}
.aieo-chat-icon-glyph{font-size: 24px}
.aieo-chat-source-chip{background: #96588a; color: #fff; padding: 2px 6px; border-radius: 3px; font-size: 10px}
.aieo-chat-entry{background: #f8f9fa; border: 1px solid #e2e8f0; border-radius: 6px; padding: 12px; margin-bottom: 10px}
.aieo-chat-entry-head{display: flex; justify-content: space-between; align-items: flex-start}
.aieo-chat-entry-title{font-size: 14px}
.aieo-chat-entry-meta{margin-top: 4px; font-size: 12px; color: #666}
.aieo-chat-entry-type{background: #e2e8f0; padding: 2px 8px; border-radius: 3px; margin-right: 8px}
.aieo-chat-entry-body{margin: 8px 0 0 0; font-size: 13px; color: #444; white-space: pre-wrap}
.aieo-chat-cpt-fields{margin:10px 0 0 20px}
.aieo-ads-msg{opacity:.8}
.aieo-ads-landing{margin:0 0 10px;font-size:12px;opacity:.8}
.aieo-ads-assets{display:flex;flex-wrap:wrap;gap:24px;align-items:flex-start}
.aieo-ads-keywords{margin:12px 0 0;max-width:820px}
.aieo-ads-keywords-list{font-size:12px;opacity:.85}
.aieo-ads-asset-col{flex:1 1 320px;min-width:280px}
.aieo-ads-none{margin:4px 0 0;opacity:.7;font-size:12px}
.aieo-ads-asset-items{margin:6px 0 0;padding:0;list-style:none}
.aieo-ads-asset-item{padding:2px 0;font-size:13px;line-height:1.5}
.aieo-ads-asset-count{color:#86868b;font-size:11px}
.aieo-ads-points{margin:0;padding:0;list-style:none;max-width:820px}
.aieo-ads-point{display:flex;gap:10px;padding:4px 0;line-height:1.5}
.aieo-ads-point-icon{flex:0 0 auto;color:#1e7e34}
.aieo-flush-top{margin-top:0}
.aieo-measure{max-width:820px}
.aieo-con-lists{display:flex;gap:28px;flex-wrap:wrap;max-width:900px;margin:12px 0}
.aieo-con-list-title{margin:0 0 4px;font-weight:600}
.aieo-con-list{margin:0 0 0 18px;list-style:disc;font-size:13px;color:#50575e}
.aieo-wp-subhead{margin:14px 0 6px;font-size:13px}
.aieo-wp-subhead--spaced{margin-top:18px}
.aieo-wp-group-th{padding-top:6px;color:#374151}
.aieo-bs-glass{margin:8px 0 0;font-size:13px}
.aieo-nowrap{white-space:nowrap}
.aieo-bs-fieldset{border:0;margin:0;padding:0;min-width:0}
.aieo-bs-row{margin:8px 0 0}
.aieo-bs-row--roomy{margin-top:10px}
.aieo-bs-help{display:block;margin-top:2px}
.aieo-grv-actions{margin-bottom:10px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.aieo-grv-note{color:#646970;font-size:12px}
.aieo-grv-steps{margin-left:18px;line-height:1.7}
.aieo-grv-para{margin-top:14px}
.aieo-grv-subhead{margin:14px 0 6px}
.aieo-grv-lead{margin:0 0 6px}
.aieo-grv-note--flush{margin:0}
.aieo-grv-lead--roomy{margin-bottom:8px}
.aieo-grv-codes{margin:6px 0 6px 18px;line-height:1.7;font-family:Menlo,Consolas,monospace;font-size:13px}
.aieo-grv-code-note{color:#646970;font-family:sans-serif;font-size:12px}
.aieo-grv-lead--snug{margin:6px 0 4px}
.aieo-grv-attrs{margin:0 0 6px 18px;line-height:1.6;font-size:12px}
.aieo-grv-lead--example{margin:8px 0 4px}
.aieo-code-wrap-all{white-space:pre-wrap;word-break:break-all}
.aieo-text-2xs{font-size:11px}
.aieo-sc-help--tight{margin:0 0 8px}
.aieo-sc-help{margin:0 0 10px}
.aieo-sc-controls{display:flex;flex-wrap:wrap;gap:14px 22px;align-items:center;font-size:13px;margin:0 0 12px}
.aieo-sc-control{display:inline-flex;align-items:center;gap:6px}
.aieo-sc-table{margin-top:4px;max-width:520px}
.aieo-sc-th--first{width:120px}
.aieo-sc-th{text-align:left}
.aieo-sc-control--spaced{gap:8px;margin-right:18px}
.aieo-sc-control--wide{gap:8px}
.aieo-sc-note{margin:0 0 12px 24px;font-size:13px}
.aieo-sc-legend{font-weight:600;padding:0 6px}
.aieo-sc-controls--loose{gap:14px 24px;margin:0}
.aieo-sc-subhead{margin:18px 0 4px}
.aieo-sc-plain{font-weight:normal}
.aieo-qr-modal-title{flex:1;min-width:0}
.aieo-qr-modal-meta{margin:4px 0 0;color:#6b7280;font-size:12px}
.aieo-qr-modal-close{font-size:20px;line-height:1}
.aieo-cati-feed-xml{width:100%;max-width:760px;font-family:monospace;font-size:12px}
.aieo-cati-wide-field{width:360px}

/* Markup round (R3): marketplace feeds (the availability tables, the brand pickers, the cache strategy). */
.aieo-mf-flush { margin: 0; }
.aieo-mf-label-col { width: 240px; }
.aieo-mf-wide { width: 100%; }
.aieo-mf-cache-mode { width: 100%; max-width: 600px; }
/* Markup round R4: badges, and the sizes the scan found. */
.aieo-save-status{margin-left:10px;color:#646970;font-size:13px}
.aieo-badges-icon-input{text-align:center;font-size:16px}
.aieo-badges-preview-img{max-width:100%;max-height:100%;display:block}
.aieo-badges-preview-none{color:#a7aaad;font-size:18px;line-height:1}
.aieo-badges-image-cell-row{display:flex;align-items:center;gap:6px}
.aieo-badges-preview-box{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border:1px solid #dcdcde;border-radius:4px;background:#f6f7f7;overflow:hidden}
.aieo-badges-check{margin-right:10px;font-size:12px}
.aieo-badges-classes{margin-top:12px;background:#f6f7f7;border:1px solid #dcdcde;border-radius:4px;padding:10px 14px}
.aieo-details-summary{cursor:pointer;font-weight:600}
.aieo-badges-classes-intro{margin-top:8px}
.aieo-badges-classes-code{font-size:12px;background:#fff;padding:10px;border-radius:3px}
body .aieo-chat-field-medium,input.regular-text.aieo-chat-field-medium{width:100%;max-width:350px}
body[class*="page_ai-eshop-chat"] .aieo-chat-list-styled{font-size:13px}
.aieo-sc-subhead{font-size:16px}
body[class*="page_ai-eshop-dmm"] small{font-size:12px}

/* Markup round (R3): customer intelligence / web push (notes, status lines, sub-headings, lists, the roadmap box). */
.aieo-wp-list { margin: 6px 0 0 20px; list-style: disc; font-size: 12px; }
.aieo-wp-label { font-size: 12px; color: var(--ra-muted-foreground, #374151); }
.aieo-wp-note { font-size: 12px; color: var(--ra-muted-foreground, #374151); }
.aieo-wp-note--spaced { margin-top: 10px; }
.aieo-wp-note--faint { color: var(--ra-secondary-foreground, #9ca3af); }
.aieo-wp-note--small { font-size: 11px; margin-top: 6px; }
.aieo-wp-status { margin-left: 10px; font-size: 13px; color: var(--ra-muted-foreground, #646970); }
.aieo-wp-subhead { margin: 14px 0 6px; font-size: 13px; font-weight: 600; }
.aieo-wp-subhead--spaced { margin-top: 18px; }
.aieo-wp-schedule { margin-left: 8px; }
.aieo-wp-steps { margin: 0 0 14px 20px; font-size: 13px; line-height: 1.6; }
.aieo-wp-roadmap { margin-top: 14px; padding: 12px; background: var(--ra-info-soft, #f0f9ff); border-left: 3px solid var(--ra-info, #0891b2); border-radius: 4px; font-size: 12px; }
.aieo-newsletter-provider-fields[hidden] { display: none; }
