/* =========================================================================
 * OXP Breaking News Ticker — Frontend
 * Structure comes from .oxp-tkr--theme-{id}; color comes from CSS custom
 * properties injected inline by the renderer (single source of truth:
 * the Palettes PHP class). Custom palettes may inject gradients.
 * ========================================================================= */

.oxp-tkr,
.oxp-tkr * { box-sizing: border-box; }

/* ---------- Wrapper (consumes variables with fallbacks) ---------- */
.oxp-tkr {
  --oxp-tkr-radius: 0px;
  --oxp-tkr-shadow: 0 4px 14px rgba(0, 0, 0, .15);
  --oxp-tkr-transition: .6s;
  --oxp-tkr-ease: ease;
  --oxp-tkr-focus: var(--oxp-tkr-tag-bg, currentColor);

  display: flex;
  align-items: stretch;
  width: 100%;
  max-width: var(--oxp-tkr-max-width, none);
  margin-inline: auto;
  height: var(--oxp-tkr-height, 48px);
  background: var(--oxp-tkr-bg, #111827);
  color: var(--oxp-tkr-text, #f9fafb);
  overflow: hidden;
  font-family: var(--oxp-tkr-font-family, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif);
  font-size: var(--oxp-tkr-font-size, 15px);
  font-weight: var(--oxp-tkr-font-weight, 400);
  font-style: var(--oxp-tkr-font-style, normal);
  box-shadow: var(--oxp-tkr-shadow);
  border-radius: var(--oxp-tkr-radius);
}

/* ---------- Tag / label ---------- */
.oxp-tkr__tag {
  display: flex;
  align-items: center;
  flex: 0 0 auto;
  padding: 0 18px;
  background: var(--oxp-tkr-tag-bg, #dc2626);
  color: var(--oxp-tkr-tag-text, #ffffff);
  font-family: var(--oxp-tkr-tag-font-family, inherit);
  font-size: var(--oxp-tkr-tag-font-size, inherit);
  font-weight: var(--oxp-tkr-tag-font-weight, 700);
  font-style: var(--oxp-tkr-tag-font-style, normal);
  text-decoration: var(--oxp-tkr-tag-text-decoration, none);
  text-transform: var(--oxp-tkr-tag-text-transform, uppercase);
  letter-spacing: .04em;
  white-space: nowrap;
  position: relative;
}
.oxp-tkr__tag::after {
  content: "";
  position: absolute;
  right: -9.5px;
  top: 0;
  width: 0;
  height: 0;
  border-style: solid;
  border-width: calc(var(--oxp-tkr-height, 48px) / 2) 0 calc(var(--oxp-tkr-height, 48px) / 2) 10px;
  border-color: transparent transparent transparent var(--oxp-tkr-tag-decoration, var(--oxp-tkr-tag-bg, #dc2626));
  z-index: 2;
}

/* ---------- Pulse dot ---------- */
.oxp-tkr__pulse {
  display: flex;
  position: relative;
  flex: 0 0 auto;
  align-self: center;
  width: 9px;
  height: 9px;
  margin-right: 9px;
  border-radius: 50%;
  background: var(--oxp-tkr-pulse, #ffffff);
}
.oxp-tkr__pulse::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: var(--oxp-tkr-pulse, #ffffff);
  animation: oxp-tkr-pulse 1.6s ease-out infinite;
}
@keyframes oxp-tkr-pulse {
  0%   { transform: scale(1);   opacity: .7; }
  100% { transform: scale(3.2); opacity: 0; }
}

/* ---------- Per-headline pulse dot (optional) ---------- */
.oxp-tkr__item-pulse {
  display: inline-flex;
  position: relative;
  flex: 0 0 auto;
  align-self: center;
  width: 8px;
  height: 8px;
  margin-right: 10px;
  border-radius: 50%;
  background: var(--oxp-tkr-item-pulse, var(--oxp-tkr-tag-bg, #dc2626));
}
.oxp-tkr__item-pulse::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: inherit;
  animation: oxp-tkr-pulse 1.6s ease-out infinite;
}

/* ---------- News area ---------- */
.oxp-tkr__news-area {
  position: relative;
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  margin: 0;
  padding: 0;
  list-style: none;
}
.oxp-tkr__news-item {
  position: absolute;
  inset: 0;
  min-width: 0;
  transform: translateX(100%);
  opacity: 0;
  pointer-events: none;
  transition: transform var(--oxp-tkr-transition) var(--oxp-tkr-ease),
              opacity   var(--oxp-tkr-transition) var(--oxp-tkr-ease);
}
.oxp-tkr__news-item.park-left  { transform: translateX(-100%); opacity: 0; }
.oxp-tkr__news-item.park-right { transform: translateX(100%);  opacity: 0; }
.oxp-tkr__news-item.park-up    { transform: translateY(-100%); opacity: 0; }
.oxp-tkr__news-item.park-down  { transform: translateY(100%);  opacity: 0; }
.oxp-tkr__news-item.is-active {
  transform: translateX(0);
  opacity: 1;
  pointer-events: auto;
}
.oxp-tkr__news-item.no-anim { transition: none !important; }

.oxp-tkr__news-link {
  display: flex;
  align-items: center;
  width: 100%;
  height: 100%;
  padding: 0 24px;
  min-width: 0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  color: var(--oxp-tkr-text, inherit);
  text-decoration: var(--oxp-tkr-text-decoration, none);
  text-transform: var(--oxp-tkr-text-transform, none);
}
a.oxp-tkr__news-link:hover {
  color: var(--oxp-tkr-text-hover, #dc2626);
  text-decoration: var(--oxp-tkr-text-decoration, none);
}
a.oxp-tkr__news-link:focus-visible {
  outline: 2px solid var(--oxp-tkr-focus);
  outline-offset: -3px;
  text-decoration: underline;
}
.oxp-tkr__news-link--plain { cursor: default; }

/* ---------- Controls ---------- */
.oxp-tkr__controls {
  display: flex;
  align-items: stretch;
  flex: 0 0 auto;
}
.oxp-tkr__controls > button {
  border: 1px solid var(--oxp-tkr-btn-border, transparent);
  background: var(--oxp-tkr-btn-bg, transparent);
  color: var(--oxp-tkr-btn-icon, #f9fafb);
  min-width: 44px;
  padding: 0;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background .2s ease, color .2s ease, border-color .2s ease;
}
.oxp-tkr__controls > button:hover {
  background: var(--oxp-tkr-btn-bg-hover, rgba(127, 127, 127, .14));
  color: var(--oxp-tkr-btn-icon-hover, #f87171);
}
.oxp-tkr__controls > button:focus-visible {
  outline: 2px solid var(--oxp-tkr-focus);
  outline-offset: -3px;
}
.oxp-tkr__controls > button[disabled] { opacity: .4; cursor: default; }
.oxp-tkr__ctrl-icon { width: 18px; height: 18px; display: block; }

.oxp-tkr__controls--toggle .oxp-tkr__ctrl-icon--play  { display: none; }
.oxp-tkr__controls--toggle .oxp-tkr__ctrl-icon--pause { display: block; }
.oxp-tkr__controls--toggle:not(.is-playing) .oxp-tkr__ctrl-icon--pause { display: none; }
.oxp-tkr__controls--toggle:not(.is-playing) .oxp-tkr__ctrl-icon--play  { display: block; }

/* ---------- Optional edge fade ---------- */
/* Masks the news area so headlines fade out at its sides. A mask (instead of
 * gradient overlays) works over any background, including gradients. */
.oxp-tkr--edge-fade .oxp-tkr__news-area {
  -webkit-mask-image: linear-gradient(90deg, transparent 0, #000 32px, #000 calc(100% - 32px), transparent 100%);
          mask-image: linear-gradient(90deg, transparent 0, #000 32px, #000 calc(100% - 32px), transparent 100%);
}

/* ---------- Continuous marquee mode ---------- */
/* The area is a clipping viewport; the track is a strip with all items in a
 * row, animated with a CSS keyframe. JS measures the strip, clones it for a
 * seamless wrap, and sets --oxp-tkr-marquee-dist / --oxp-tkr-marquee-duration.
 * The animation ships paused so no-JS visitors get a static, readable strip. */
.oxp-tkr__news-area--marquee { display: flex; align-items: stretch; }
.oxp-tkr__track {
  display: flex;
  align-items: stretch;
  flex: 0 0 auto;
  min-width: 100%;
  margin: 0;
  padding: 0;
  list-style: none;
  will-change: transform;
  animation: oxp-tkr-marquee var(--oxp-tkr-marquee-duration, 30s) linear infinite;
  animation-play-state: paused;
}
.oxp-tkr__track.is-running { animation-play-state: running; }
.oxp-tkr__track--reverse { animation-direction: reverse; }
@keyframes oxp-tkr-marquee {
  from { transform: translateX(0); }
  to   { transform: translateX(var(--oxp-tkr-marquee-dist, -100%)); }
}
.oxp-tkr--marquee .oxp-tkr__news-item {
  position: static;
  inset: auto;
  display: flex;
  align-items: center;
  flex: 0 0 auto;
  transform: none;
  opacity: 1;
  pointer-events: auto;
  transition: none;
}
.oxp-tkr--marquee .oxp-tkr__news-link {
  width: auto;
  max-width: none;
  overflow: visible;
  text-overflow: clip;
  padding: 0 28px;
}

/* =========================================================================
 * THEMES (structure only)
 * ========================================================================= */
/* Classic: uses the base values (straight bar, label with arrow). */

/* Modern: rounded, wide shadow, contained 'island' label. */
.oxp-tkr--theme-modern {
  --oxp-tkr-radius: 12px;
  --oxp-tkr-shadow: 0 10px 30px rgba(0, 0, 0, .18);
  position: relative;
}
.oxp-tkr--theme-modern::before {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: linear-gradient(90deg, rgba(255, 255, 255, .08), rgba(255, 255, 255, 0) 40%);
}
.oxp-tkr--theme-modern .oxp-tkr__tag {
  align-self: center;
  height: calc(var(--oxp-tkr-height, 48px) - 10px);
  margin-left: 6px;
  border-radius: 8px;
}
.oxp-tkr--theme-modern .oxp-tkr__tag::after { display: none; }

/* Breaking: skewed bar with an offset label and wrapped controls. */
.oxp-tkr--theme-breaking {
  --oxp-tkr-radius: 8px;
  --oxp-tkr-shadow: 0 8px 24px rgba(0, 0, 0, .28);
  position: relative;
  overflow: visible;
  transform: skewX(-4deg);
}
.oxp-tkr--theme-breaking::before {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: linear-gradient(100deg, rgba(255, 255, 255, .12), rgba(255, 255, 255, 0) 55%);
}
/* Counter-skew inner content for readability. */
.oxp-tkr--theme-breaking .oxp-tkr__tag-text,
.oxp-tkr--theme-breaking .oxp-tkr__pulse,
.oxp-tkr--theme-breaking .oxp-tkr__news-link,
.oxp-tkr--theme-breaking .oxp-tkr__ctrl-icon { transform: skewX(4deg); }
/* Label: offset above and to the left. */
.oxp-tkr--theme-breaking .oxp-tkr__tag {
  align-self: center;
  height: calc(var(--oxp-tkr-height, 48px) - 10px);
  margin: 0 16px 0 7px;
  margin-left: -4px;
  border-radius: 6px;
  border-bottom: 3px solid var(--oxp-tkr-tag-border, rgba(0, 0, 0, .28));
  box-shadow: 0 4px 10px rgba(0, 0, 0, .3);
  z-index: 1;
}
.oxp-tkr--theme-breaking .oxp-tkr__tag::after { display: none; }
/* Controls: visual wrapper. */
.oxp-tkr--theme-breaking .oxp-tkr__controls {
  background: rgba(255, 255, 255, .08);
  border-radius: 0 8px 8px 0;
}

/* Minimalist: flat and airy — no chip, no shadow; the label becomes
 * accent-colored text followed by a hairline divider. */
.oxp-tkr--theme-minimal {
  --oxp-tkr-radius: 0;
  --oxp-tkr-shadow: none;
}
.oxp-tkr--theme-minimal .oxp-tkr__tag {
  background: transparent;
  padding: 0 16px;
  /* Readable fallback when background-clip: text is unsupported. */
  color: var(--oxp-tkr-text, #f9fafb);
}
@supports ((-webkit-background-clip: text) or (background-clip: text)) {
  .oxp-tkr--theme-minimal .oxp-tkr__tag-text {
    /* Paint the label text with the tag color; also works with gradients. */
    background: var(--oxp-tkr-tag-bg, #dc2626);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
  }
}
/* The label pulse sits on the bar background here (not on the chip), so it
 * borrows the tag color to stay visible on any palette. */
.oxp-tkr--theme-minimal .oxp-tkr__pulse,
.oxp-tkr--theme-minimal .oxp-tkr__pulse::after {
  background: var(--oxp-tkr-tag-bg, #dc2626);
}
/* Arrow replaced by a hairline divider. */
.oxp-tkr--theme-minimal .oxp-tkr__tag::after {
  right: 0;
  top: 22%;
  width: 1px;
  height: 56%;
  border: 0;
  background: var(--oxp-tkr-text, currentColor);
  opacity: .3;
}

/* =========================================================================
 * FADE MODE (crossfade in place)
 * ========================================================================= */
/* The slide engine drives the same park/is-active classes; forcing the
 * transform off leaves opacity as the only animated property. */
.oxp-tkr--fade .oxp-tkr__news-item,
.oxp-tkr--fade .oxp-tkr__news-item.park-left,
.oxp-tkr--fade .oxp-tkr__news-item.park-right,
.oxp-tkr--fade .oxp-tkr__news-item.park-up,
.oxp-tkr--fade .oxp-tkr__news-item.park-down {
  transform: none;
}

/* ---------- Responsive ---------- */
@media (max-width: 640px) {
  .oxp-tkr { font-size: 14px; }
  .oxp-tkr__tag { padding: 0 12px; }
  .oxp-tkr__news-link { padding: 0 16px; }
}

@media (max-width: 480px) {
  .oxp-tkr { font-size: 13px; }
  .oxp-tkr__tag { padding: 0 10px; letter-spacing: .02em; }
  .oxp-tkr__news-link { padding: 0 12px; }
  .oxp-tkr__controls > button { min-width: 36px; }

  /* Narrower edge fade so headlines keep enough readable width. */
  .oxp-tkr--edge-fade .oxp-tkr__news-area {
    -webkit-mask-image: linear-gradient(90deg, transparent 0, #000 18px, #000 calc(100% - 18px), transparent 100%);
            mask-image: linear-gradient(90deg, transparent 0, #000 18px, #000 calc(100% - 18px), transparent 100%);
  }

  /* Simplify the breaking theme on very small screens. */
  .oxp-tkr--theme-breaking {
    transform: none;
    overflow: hidden;
    border-radius: var(--oxp-tkr-radius);
  }
  .oxp-tkr--theme-breaking .oxp-tkr__tag { border-radius: 4px; }
  .oxp-tkr--theme-breaking .oxp-tkr__tag-text,
  .oxp-tkr--theme-breaking .oxp-tkr__pulse,
  .oxp-tkr--theme-breaking .oxp-tkr__news-link,
  .oxp-tkr--theme-breaking .oxp-tkr__ctrl-icon { transform: none; }
}

/* ---------- Reduced motion (WCAG 2.3.3 / 2.2.2) ---------- */
@media (prefers-reduced-motion: reduce) {
  .oxp-tkr__news-item {
    transition: opacity .2s ease !important;
    transform: none !important;
  }
  .oxp-tkr__news-item:not(.is-active) { opacity: 0; }
  .oxp-tkr__pulse::after,
  .oxp-tkr__item-pulse::after { animation: none; }

  /* Marquee: freeze the strip; every item stays visible and readable. */
  .oxp-tkr__track { animation: none; }
  .oxp-tkr--marquee .oxp-tkr__news-item { opacity: 1; }
}
