From 1596e2b4c5fbdb339b611e196ef237ff9d4da067 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9nich=20Bon=20=C4=86iri=C4=87?= Date: Mon, 15 Jun 2026 04:48:47 -0600 Subject: [PATCH 1/2] ux: add accessible labels to generated scaffold views MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add label ECR/Slang helpers to text and standard text input fields in scaffold templates. Co-developed-by: Gemini AI Signed-off-by: Rénich Bon Ćirić --- .../templates/scaffold/view/src/views/{{name}}/_form.ecr.ecr | 2 ++ .../templates/scaffold/view/src/views/{{name}}/_form.slang.ecr | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/amber_cli/templates/scaffold/view/src/views/{{name}}/_form.ecr.ecr b/src/amber_cli/templates/scaffold/view/src/views/{{name}}/_form.ecr.ecr index 67da6ac..8c1205a 100644 --- a/src/amber_cli/templates/scaffold/view/src/views/{{name}}/_form.ecr.ecr +++ b/src/amber_cli/templates/scaffold/view/src/views/{{name}}/_form.ecr.ecr @@ -17,6 +17,7 @@
<% case field.type when "text" -%> + <%="<"%>%= label(<%=":#{field.name}"%>) -%> <%="<"%>%= text_area(name: "<%= field.name -%>", content: <%= @name %>.<%= field.name %>, placeholder: "<%= field.name.capitalize %>", class: "form-control", size: "30x10") -%> <% when "boolean" -%> <%="<"%>%= label(<%=":#{field.name}"%>) do @@ -27,6 +28,7 @@ <%="<"%>%= label(<%=":#{field.name}"%>) -%> <%="<"%>%= select_field(name: "<%= field.name %>_id", collection: <% if config.model == "crecto" %>Repo.all(<%= field.class_name %>)<% else %><%= field.class_name %>.all<% end %>.map{|<%= field.name %>| [<%= field.name %>.id, <%= field.name %>.id]}, selected: <%= @name %>.<%= field.name %>_id, class: "form-control") -%> <% else -%> + <%="<"%>%= label(<%=":#{field.name}"%>) -%> <%="<"%>%= text_field(name: "<%= field.name %>", value: <%= @name %>.<%= field.name %>, placeholder: "<%= field.name.capitalize %>", class: "form-control") -%> <% end -%>
diff --git a/src/amber_cli/templates/scaffold/view/src/views/{{name}}/_form.slang.ecr b/src/amber_cli/templates/scaffold/view/src/views/{{name}}/_form.slang.ecr index 5a910c3..cf8d447 100644 --- a/src/amber_cli/templates/scaffold/view/src/views/{{name}}/_form.slang.ecr +++ b/src/amber_cli/templates/scaffold/view/src/views/{{name}}/_form.slang.ecr @@ -9,6 +9,7 @@ .form-group <%- case field.type when "text" -%> + == label(<%=":#{field.name}"%>) == text_area(name: "<%= field.name -%>", content: <%= @name %>.<%= field.name %>, placeholder: "<%= field.name.capitalize %>", class: "form-control", size: "30x10") <%- when "boolean" -%> == label(<%=":#{field.name}"%>) do @@ -17,6 +18,7 @@ == label(<%=":#{field.name}"%>) == select_field(name: "<%= field.name %>_id", collection: <% if config.model == "crecto" %>Repo.all(<%= field.class_name %>)<% else %><%= field.class_name %>.all<% end %>.map{|<%= field.name %>| [<%= field.name %>.id, <%= field.name %>.id]}, selected: <%= @name %>.<%= field.name %>_id, class: "form-control") <%- else -%> + == label(<%=":#{field.name}"%>) == text_field(name: "<%= field.name %>", value: <%= @name %>.<%= field.name %>, placeholder: "<%= field.name.capitalize %>", class: "form-control") <%- end -%> <%- end -%> From 29cc7f3d451d2916526c6e0b7af01d1bdf71a831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9nich=20Bon=20=C4=86iri=C4=87?= Date: Wed, 16 Sep 2026 01:48:55 -0600 Subject: [PATCH 2/2] ux(scaffold): associate labels and inputs with matching id and for attributes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update active GenerateCommand Slang scaffold forms and legacy templates with accessible label-input associations matching WCAG 2.1 requirements. Co-developed-by: Gemini AI Signed-off-by: Rénich Bon Ćirić --- src/amber_cli/commands/generate.cr | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/amber_cli/commands/generate.cr b/src/amber_cli/commands/generate.cr index 10de627..414546a 100644 --- a/src/amber_cli/commands/generate.cr +++ b/src/amber_cli/commands/generate.cr @@ -1547,21 +1547,21 @@ VIEW if input_type == "textarea" <<-FIELD .form-group - label #{field_name.camelcase} - textarea name="#{field_name}" = @#{variable_name}.try(&.#{field_name}) + label for="#{field_name}" #{field_name.camelcase} + textarea id="#{field_name}" name="#{field_name}" = @#{variable_name}.try(&.#{field_name}) FIELD elsif input_type == "checkbox" <<-FIELD .form-group - label - input type="checkbox" name="#{field_name}" checked=@#{variable_name}.try(&.#{field_name}) + label for="#{field_name}" + input id="#{field_name}" type="checkbox" name="#{field_name}" checked=@#{variable_name}.try(&.#{field_name}) | #{field_name.camelcase} FIELD else <<-FIELD .form-group - label #{field_name.camelcase} - input type="#{input_type}" name="#{field_name}" value=@#{variable_name}.try(&.#{field_name}) + label for="#{field_name}" #{field_name.camelcase} + input id="#{field_name}" type="#{input_type}" name="#{field_name}" value=@#{variable_name}.try(&.#{field_name}) FIELD end end.join("\n")