app/views/devise/registrations/new.html.erb
<%= bootstrap_devise_error_messages! %>
<div class="row justify-content-center">
<div class="col-lg-6">
<div class="card">
<div class="card-header text-muted"><%= title t('.sign_up') %></div>
<div class="card-body">
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { role: 'form' }) do |f| %>
<% if Rails.configuration.invitation_enabled %>
<div class="form-group">
<%= f.label :invitation_token %>
<%= f.text_field :invitation_token, value: resource.invitation_token.presence || params[:code], required: true, class: "form-control #{"is-invalid" if resource.errors[:invitation_token].any?}" %>
<span class="form-text text-muted"><%= t('.need_invitation') %> <%= link_to t('.request_invitation'), new_invitation_path %></span>
</div>
<% end %>
<div class="form-group">
<%= f.label :username %>
<%= f.text_field :username, required: true, autocomplete: "username", pattern: "^#{User::USERNAME_PATTERN}$", class: "form-control #{"is-invalid" if resource.errors[:username].any?}" %>
</div>
<div class="form-group">
<%= f.label :email %>
<%= f.email_field :email, required: true, value: resource.email.presence || params[:email], autocomplete: "email", class: "form-control #{"is-invalid" if resource.errors[:email].any?}" %>
</div>
<div class="form-group">
<%= f.label :password %>
<%= f.password_field :password, required: true, autocomplete: "new-password", class: "form-control #{"is-invalid" if resource.errors[:password].any?}" %>
</div>
<div class="form-group">
<%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, required: true, class: "form-control #{"is-invalid" if resource.errors[:password_confirmation].any?}" %>
</div>
<%= f.submit t('.sign_up', default: 'Sign up'), class: 'btn btn-primary btn-block' %>
<% end %>
</div>
</div>
<p class="text-muted text-center mt-3"><%= t('.tos_html') %></p>
</div>
</div>