Files
RosterChief/templates/allauth/elements/fields.html
Bernard Siebens 7b18b39f49 Put icons in the login fields and drop their labels
The entrance forms lose their visible field labels and gain an icon inside each
field (mail, lock), and allauth's "Forgot your password?" link -- which is the
password field's help_text -- is spaced away from the input instead of sitting
flush against it.

Three things this depends on:

- allauth already passes `unlabeled=True` on the entrance forms and already sets
  a placeholder on every field there, so the visible label was redundant. The
  label is still emitted sr-only: a placeholder is not a label, and it vanishes
  as soon as you type.
- daisyUI's icon-in-field layout puts the `input` class on the *wrapping label*,
  so the input itself must carry only `grow` -- hence the optional css override on
  the daisy filter. `input` on both draws a box inside a box, and the error state
  belongs on the wrapper for the same reason.
- The help text now carries id="<auto_id>_helptext". Django points the input's
  aria-describedby at exactly that id, so without it the reference dangled and a
  screen reader never announced the password-reset link.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 22:43:44 +02:00

55 lines
2.7 KiB
HTML

{% load lucide ui %}
{% comment %}
allauth passes `unlabeled=True` on the entrance forms (login, signup, reset) and
already sets a placeholder on each of their fields ("Email address", "Password"),
so dropping the visible label loses nothing on screen. The label is still emitted
sr-only inside the wrapper: a placeholder is not a label, and it disappears the
moment you start typing.
Fields with an icon use daisyUI's icon-in-field layout, where the `input` class
goes on the *wrapping label* and the input itself carries only `grow`. Putting
`input` on both draws a box inside a box.
{% endcomment %}
{% for field in attrs.form.hidden_fields %}{{ field }}{% endfor %}
{% for error in attrs.form.non_field_errors %}
<div class="alert alert-error my-2">
<span>{{ error }}</span>
</div>
{% endfor %}
{% for field in attrs.form.visible_fields %}
<div class="form-control my-3 w-full">
{% if field.field.widget.input_type == "checkbox" %}
<label class="label cursor-pointer justify-start gap-3" for="{{ field.id_for_label }}">
{{ field|daisy }}
<span class="label-text">{{ field.label }}</span>
</label>
{% else %}
{% if not attrs.unlabeled %}
<label class="label" for="{{ field.id_for_label }}">
<span class="label-text">{{ field.label }}</span>
</label>
{% endif %}
{% with icon=field|field_icon %}
{% if icon %}
<label class="input flex w-full items-center gap-2 {% if field.errors %}input-error{% endif %}" for="{{ field.id_for_label }}">
<span class="opacity-50">{% lucide icon size=16 %}</span>
{% if attrs.unlabeled %}<span class="sr-only">{{ field.label }}</span>{% endif %}
{{ field|daisy:"grow" }}
</label>
{% else %}
{{ field|daisy }}
{% endif %}
{% endwith %}
{% endif %}
{% comment %}
The password field's help_text is allauth's "Forgot your password?" link, so it
gets room to breathe. The id is not decorative: Django points the input's
aria-describedby at `<auto_id>_helptext`, and without it that reference dangles
and the link is never announced.
{% endcomment %}
{% if field.help_text %}<span id="{{ field.auto_id }}_helptext" class="label-text-alt mt-3 block text-base-content/70">{{ field.help_text }}</span>{% endif %}
{% for error in field.errors %}<span class="label-text-alt mt-1 text-error">{{ error }}</span>{% endfor %}
</div>
{% endfor %}