@layer components {
  :root {
    --form-color: #111827;
    --form-background-color: #ffffff;
    --form-border-color: #d1d5db;
    --form-border-hover-color: #9ca3af;
    --form-placeholder-color: #9ca3af;
    --form-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);

    --form-focus-border-color: #0e7490;
    --form-focus-ring-color: rgba(14, 116, 144, 0.18);
    --form-accent-color: #0e7490;

    --form-disabled-color: #9ca3af;
    --form-disabled-background-color: #f3f4f6;
    --form-readonly-background-color: #f9fafb;

    --form-label-color: #4b5563;
    --form-hint-color: #6b7280;

    --form-error-color: hsl(0, 84%, 60%);
    --form-error-background-color: hsl(0, 86%, 97%);
    --form-error-focus-ring-color: rgba(239, 68, 68, 0.18);
  }

  /* ---- Native form elements ---------------------------------------------- */

  :where(
    input[type="text"],
    input[type="email"],
    input[type="password"],
    input[type="url"],
    input[type="search"],
    input[type="tel"],
    input[type="number"],
    input[type="date"],
    input[type="datetime-local"],
    input[type="time"],
    textarea,
    select
  ) {
    display: block;
    width: 100%;
    max-width: 100%;
    padding: 0.4rem;
    font-family: inherit;
    font-size: 1rem;
    line-height: 1.5;
    color: var(--form-color);
    background-color: var(--form-background-color);
    border: 1px solid var(--form-border-color);
    border-radius: 5px;
    box-shadow: var(--form-shadow);
    transition:
      border-color 0.15s ease,
      box-shadow 0.15s ease,
      background-color 0.15s ease;
    appearance: none;
  }

  textarea {
    min-height: 6rem;
    resize: vertical;
  }

  select {
    padding-right: 2.25rem;
    background-image: var(--blitz-icon-caret-down-light);
    background-repeat: no-repeat;
    background-position: right 0.625rem center;
    background-size: 1.25rem 1.25rem;
  }

  :where(
    input[type="text"],
    input[type="email"],
    input[type="password"],
    input[type="url"],
    input[type="search"],
    input[type="tel"],
    input[type="number"],
    input[type="date"],
    input[type="datetime-local"],
    input[type="time"],
    textarea
  )::placeholder {
    font-style: italic;
    color: var(--form-placeholder-color);
  }

  :where(
    input[type="text"],
    input[type="email"],
    input[type="password"],
    input[type="url"],
    input[type="search"],
    input[type="tel"],
    input[type="number"],
    input[type="date"],
    input[type="datetime-local"],
    input[type="time"],
    textarea,
    select
  ):hover:not(:disabled):not(:focus) {
    border-color: var(--form-border-hover-color);
  }

  :where(
    input[type="text"],
    input[type="email"],
    input[type="password"],
    input[type="url"],
    input[type="search"],
    input[type="tel"],
    input[type="number"],
    input[type="date"],
    input[type="datetime-local"],
    input[type="time"],
    textarea,
    select
  ):focus {
    outline: none;
    border-color: var(--form-focus-border-color);
    box-shadow: 0 0 0 3px var(--form-focus-ring-color);
  }

  :where(
    input[type="text"],
    input[type="email"],
    input[type="password"],
    input[type="url"],
    input[type="search"],
    input[type="tel"],
    input[type="number"],
    input[type="date"],
    input[type="datetime-local"],
    input[type="time"],
    textarea,
    select
  ):disabled {
    background-color: var(--form-disabled-background-color);
    color: var(--form-disabled-color);
    cursor: not-allowed;
  }

  :where(
    input[type="text"],
    input[type="email"],
    input[type="password"],
    input[type="url"],
    input[type="search"],
    input[type="tel"],
    input[type="number"],
    input[type="date"],
    input[type="datetime-local"],
    input[type="time"],
    textarea
  ):read-only:not(:disabled) {
    background-color: var(--form-readonly-background-color);
  }

  :where(input[type="checkbox"], input[type="radio"]) {
    width: 1rem;
    height: 1rem;
    margin: 0;
    accent-color: var(--form-accent-color);
    cursor: pointer;
  }

  :where(input[type="checkbox"], input[type="radio"]):focus-visible {
    outline: 2px solid var(--form-focus-border-color);
    outline-offset: 2px;
  }

  :where(input[type="checkbox"], input[type="radio"]):disabled {
    cursor: not-allowed;
    opacity: 0.6;
  }

  input[type="file"] {
    display: block;
    width: 100%;
    max-width: 100%;
    font-family: inherit;
    font-size: 0.875rem;
    color: var(--form-color);
    cursor: pointer;
  }

  input[type="file"]::file-selector-button {
    margin-right: 0.75rem;
    padding: 0.4rem 0.75rem;
    font-family: inherit;
    font-size: 0.875rem;
    font-weight: 500;
    color: var(--form-label-color);
    background-color: var(--form-disabled-background-color);
    border: 1px solid var(--form-border-color);
    border-radius: 5px;
    cursor: pointer;
    transition: background-color 0.15s ease;
  }

  input[type="file"]::file-selector-button:hover {
    background-color: #e5e7eb;
  }

  label {
    display: block;
    font-size: 0.8125rem;
    font-weight: 600;
    color: var(--form-label-color);
    margin-bottom: 0.375rem;
  }

  fieldset {
    margin: 0 0 1rem;
    padding: 1rem;
    border: 1px solid var(--form-border-color);
    border-radius: 6px;
  }

  legend {
    padding: 0 0.375rem;
    font-size: 0.875rem;
    font-weight: 500;
    color: var(--form-label-color);
  }

  /* Rails default error wrapper + ARIA-/Bootstrap-style invalid markers */
  .field_with_errors {
    display: contents;
  }

  .field_with_errors :where(input:not([type="submit"]):not([type="button"]):not([type="reset"]), textarea, select),
  :where(input:not([type="submit"]):not([type="button"]):not([type="reset"]), textarea, select).is-invalid,
  :where(input:not([type="submit"]):not([type="button"]):not([type="reset"]), textarea, select)[aria-invalid="true"] {
    border-color: var(--form-error-color);
    background-color: var(--form-error-background-color);
  }

  .field_with_errors :where(input:not([type="submit"]):not([type="button"]):not([type="reset"]), textarea, select):focus,
  :where(input:not([type="submit"]):not([type="button"]):not([type="reset"]), textarea, select).is-invalid:focus,
  :where(input:not([type="submit"]):not([type="button"]):not([type="reset"]), textarea, select)[aria-invalid="true"]:focus {
    border-color: var(--form-error-color);
    box-shadow: 0 0 0 3px var(--form-error-focus-ring-color);
  }

  /* iOS: 16px+ font-size on inputs prevents auto-zoom on focus */
  @media (max-width: 640px) {
    :where(
      input[type="text"],
      input[type="email"],
      input[type="password"],
      input[type="url"],
      input[type="search"],
      input[type="tel"],
      input[type="number"],
      textarea,
      select
    ) {
      font-size: 16px;
    }
  }

  /* ---- BlitzFormBuilder wrapper classes ---------------------------------- */

  .blitz-form-field {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    margin-bottom: 1rem;
  }

  .blitz-form-field:last-of-type {
    margin-bottom: 0;
  }

  .blitz-form-label {
    font-size: 0.9rem;
    font-weight: 500;
    color: var(--form-label-color);
  }

  .blitz-form-control {
    position: relative;
  }

  .blitz-form-input-error {
    border-color: var(--form-error-color) !important;
    background-color: var(--form-error-background-color);
    padding-right: 2.5rem !important;
  }

  .blitz-form-error {
    margin-top: 0.35rem;
    font-size: 0.85rem;
    color: var(--form-error-color);
  }

  .blitz-form-error-icon {
    pointer-events: none;
    position: absolute;
    inset: 0 0.6rem 0 auto;
    display: flex;
    align-items: center;
    color: var(--form-error-color);
  }

  .blitz-form-error-symbol {
    --icon-size: 1.25rem;
  }

  .blitz-form-submit {
    width: 100%;
    justify-content: center;
    margin-top: 0.5rem;
  }

  .blitz-form-check {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 1rem;
  }

  .blitz-form-check-label {
    cursor: pointer;
  }

  /* ---- form_errors() helper output --------------------------------------- */

  .form-errors {
    margin-bottom: 1rem;
    padding: 0.75rem 1rem;
    border-radius: 0.5rem;
    background: var(--form-error-background-color);
    border-left: 4px solid var(--form-error-color);
    color: #991b1b;
  }

  .form-errors-message {
    margin: 0;
  }

  .form-errors-message + .form-errors-message {
    margin-top: 0.25rem;
  }

  /* ---- Generic helpers (use freely without BlitzFormBuilder) ------------- */

  .form-field {
    display: flex;
    flex-direction: column;
    margin-bottom: 1rem;
  }

  .form-hint {
    color: var(--form-hint-color);
    font-size: 0.8125rem;
    margin-top: 0.375rem;
  }
}
