/* GENERATED — do not edit. Source: shared/public/announcement.css. Run `npm run sync` after editing. */
/* The announcement card. Loaded by BOTH apps (§12): the admin editor's live
   preview and the influencer portal render the same DOM with the same CSS, so
   what the team edits is exactly what the influencer sees. */

.announcement-list {
  display: flex;
  flex-direction: column;
  gap: var(--space-5);
}

.announcement {
  background: var(--surface);
  border: 1px solid var(--border);
  border-top: 3px solid var(--accent);
  border-radius: var(--radius);
  overflow: hidden;
}

.announcement-head {
  padding: var(--space-5);
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}

.announcement-title-row {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  flex-wrap: wrap;
}

.announcement-title {
  font-size: var(--fs-lg);
  font-weight: var(--fw-bold);
  line-height: 1.25;
}

/* Pushed to the far end of the title row so it is always in the same place. */
.announcement-upload {
  margin-left: auto;
  flex-shrink: 0;
}

.announcement-upload:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

/* Per-card upload progress, appended under the head by the portal. */
.announcement-uploads {
  list-style: none;
  margin: 0;
  padding: var(--space-3) var(--space-5) 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
}

.announcement-subtitle {
  color: var(--muted);
  font-size: var(--fs-sm);
}

.date-list {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
  gap: var(--space-3);
  padding: 0 var(--space-5) var(--space-4);
}

.date-item {
  border: 1px solid var(--border-soft);
  border-radius: var(--radius-sm);
  padding: var(--space-3);
}

.date-label {
  display: block;
  font-size: var(--fs-xs);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--muted);
}

.date-value {
  font-size: var(--fs-sm);
  font-variant-numeric: tabular-nums;
}

.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: var(--space-2);
  padding: 0 var(--space-5) var(--space-4);
}

.gallery img {
  width: 100%;
  border-radius: var(--radius-sm);
  aspect-ratio: 4 / 5;
  object-fit: cover;
  background: var(--surface-2);
}

.rich-body {
  padding: 0 var(--space-5) var(--space-4);
  font-size: var(--fs-sm);
  line-height: 1.65;
}

.rich-body h3,
.rich-body h4 {
  font-size: var(--fs-md);
  font-weight: var(--fw-bold);
  margin: var(--space-4) 0 var(--space-2);
}

.rich-body h3:first-child,
.rich-body h4:first-child {
  margin-top: 0;
}

.rich-body p {
  margin: 0 0 var(--space-3);
}

.rich-body ul,
.rich-body ol {
  margin: 0 0 var(--space-3);
  padding-left: 1.25em;
}

.rich-body li {
  margin-bottom: var(--space-1);
}

.rich-body a {
  color: var(--accent);
  text-underline-offset: 2px;
}

/* The commission / code / affiliate-link footer was removed from the card: it
   repeated the same values on every campaign and the dashboard header already
   shows them. Its styles went with it. */
