.uploads-new-container {
  max-width: 42rem; /* Note: bespoke value */
  margin-inline: auto;

  & > h1 { margin-bottom: var(--spacing-8); }
  & > p  { margin-bottom: var(--spacing-32); }
}

.uploads-new-dropzone {
  display: flex;
  justify-content: center;
  padding-inline: var(--spacing-24);
  padding-top: var(--spacing-16);
  padding-bottom: var(--spacing-24);
  border: var(--stroke-weight-2) dashed var(--border-default);
  border-radius: var(--corner-radius-sm);
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
  cursor: pointer;

  &:hover { background-color: var(--background-surface-1); }

  /* Re-render after a submit with no file chosen: the dashed outline picks up
     the warning tone. Cleared by upload_controller once a file is selected. */
  &.is-invalid { border-color: var(--border-warning); }
}

.uploads-new-dropzone-inner {
  text-align: center;

  & > * + * { margin-top: var(--spacing-4); }
}

.uploads-new-dropzone-icon {
  margin-inline: auto;
  height: var(--spacing-48);
  width: var(--spacing-48);
  color: var(--symbol-default);
}

.uploads-new-dropzone-prompt {
  display: flex;
  justify-content: center;
  color: var(--text-secondary);
}

.uploads-new-dropzone-label {
  position: relative;
  cursor: pointer;
  border-radius: var(--corner-radius-sm);
  font-weight: var(--font-weight-500);
  color: var(--text-primary);

  &:hover { color: var(--text-hover); }
}
html.theme-dark .uploads-new-dropzone-label,
html.theme-dark .uploads-new-dropzone-label:hover { color: var(--text-hover); }

.uploads-new-dropzone-or { padding-left: var(--spacing-4); }

.uploads-new-dropzone-formats,
.uploads-new-dropzone-filename {
  color: var(--text-tertiary);
}

.uploads-new-file-input {
  position: absolute;
  width: var(--stroke-weight-1);
  height: var(--stroke-weight-1);
  padding: var(--spacing-0);
  margin: -1px; /* Note: negative stroke for sr-only */
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border-width: 0;
}

/* ============ Consent + store boxes ============ */
/* Both are the default greyscale card — .surface-card in the markup, which
   brings the surface-1 fill, no border, and 24px → 32px responsive padding.
   Only their inner slots are styled here. */

/* Re-render after a submit with the consent box unticked — .surface-card is
   borderless, so the solid warning stroke only ever appears in this state.
   Cleared by consent_controller once the box is ticked. */
.uploads-new-consent-card.is-invalid {
  border: var(--stroke-weight-2) solid var(--border-warning);
}

.uploads-new-consent-header,
.uploads-new-store-header {
  display: flex;
  align-items: center;
  gap: var(--spacing-8);
  margin-bottom: var(--spacing-12);
}

.uploads-new-consent-badge,
.uploads-new-store-badge {
  display: inline-flex;
  align-items: center;
  font-size: var(--font-size-12);
  /* Uppercase-only label: no line-height of its own — the inherited body
     leading is what sits the glyphs centred in the pill; a 1rem or 1 line
     box both pushed them off. Height comes from the 4px block padding. */
  font-weight: var(--font-weight-700);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  padding-inline: var(--spacing-8);
  padding-block: var(--spacing-4);
  border-radius: var(--corner-radius-xs);
  color: var(--text-secondary);
  background-color: var(--background-surface-2);
}

.uploads-new-consent-heading,
.uploads-new-store-heading {
  font-size: var(--font-size-16);
  line-height: 1.25;
  font-weight: var(--font-weight-600);
  color: var(--text-primary);
}

.uploads-new-consent-lede,
.uploads-new-store-lede {
  color: var(--text-primary);
  margin-bottom: var(--spacing-12);
}

.uploads-new-consent-list {
  color: var(--text-secondary);
  margin-bottom: var(--spacing-16);
  margin-left: var(--spacing-4);

  & > * + * { margin-top: var(--spacing-4); }
}

.uploads-new-consent-list-item {
  display: flex;
  align-items: flex-start;
  gap: var(--spacing-8);
}

.uploads-new-consent-bullet {
  color: var(--text-primary);
  margin-top: var(--spacing-2);
}

.uploads-new-consent-fine,
.uploads-new-store-fine {
  color: var(--text-tertiary);
  margin-bottom: var(--spacing-16);
}

.uploads-new-consent-toggle-label,
.uploads-new-store-toggle-label {
  display: flex;
  align-items: flex-start;
  gap: var(--spacing-12);
  padding-inline: var(--spacing-12);
  cursor: pointer;
}

/* Shared .checkbox control (objects/checkbox.css). It fills with surface-1
   for the dropdown menus, which sit on surface-2; on these surface-1 cards
   it takes the next surface up to keep the same one-step contrast.
   Scoped through the label so it outranks the object — objects/ is served
   after components/. */
.uploads-new-consent-toggle-label .checkbox,
.uploads-new-store-toggle-label .checkbox {
  margin-top: var(--spacing-2);
  background-color: var(--background-surface-2);
}

.uploads-new-consent-toggle-text,
.uploads-new-store-toggle-text {
  font-size: var(--font-size-16);
  line-height: 1.5rem;
  font-weight: var(--font-weight-500);
  color: var(--text-primary);
  user-select: none;
}
.group:hover .uploads-new-consent-toggle-text { color: var(--text-hover); }
html.theme-dark .group:hover .uploads-new-consent-toggle-text { color: var(--text-hover); }
.group:hover .uploads-new-store-toggle-text { color: var(--text-primary); }

/* The submit button stays disabled until a file is chosen and the consent box
   is ticked (upload_controller#syncSubmit). Dimmed, and the .button--filled
   hover gradient and glow are cancelled, so a disabled button never answers
   the pointer. */
.uploads-new-submit:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}
.uploads-new-submit:disabled:hover {
  background-image: var(--brand-gradient);
  filter: none;
}
