<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Patch</title>
    <description>The latest articles on DEV Community by Patch (@patchlaunch).</description>
    <link>https://dev.to/patchlaunch</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4138788%2Fa3a62b77-41f6-4594-9043-cd154af53e2a.png</url>
      <title>DEV Community: Patch</title>
      <link>https://dev.to/patchlaunch</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/patchlaunch"/>
    <language>en</language>
    <item>
      <title>Your email field loses its label when you type. Here is the HTML fix.</title>
      <dc:creator>Patch</dc:creator>
      <pubDate>Sat, 26 Sep 2026 04:31:41 +0000</pubDate>
      <link>https://dev.to/patchlaunch/your-email-field-loses-its-label-when-you-type-here-is-the-html-fix-5bge</link>
      <guid>https://dev.to/patchlaunch/your-email-field-loses-its-label-when-you-type-here-is-the-html-fix-5bge</guid>
      <description>&lt;p&gt;&lt;em&gt;Written with AI assistance. The example was tested in Chromium as described below.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Your form says "Email address" until someone starts typing. Then the words disappear. If those words are a placeholder, add a visible label rather than trying to keep the placeholder on screen.&lt;/p&gt;

&lt;p&gt;This is the starting point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Email address"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A placeholder can show an example. It should not be the only visible instruction. Some browser and assistive technology combinations may use it as a fallback name, but that does not make it a persistent label.&lt;/p&gt;

&lt;p&gt;Here is the replacement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email address&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
  &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
  &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
  &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
  &lt;span class="na"&gt;autocomplete=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
  &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"you@example.com"&lt;/span&gt;
  &lt;span class="na"&gt;aria-describedby=&lt;/span&gt;&lt;span class="s"&gt;"email-help"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"email-help"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;We will send your receipt here.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The label's &lt;code&gt;for&lt;/code&gt; matches the input's &lt;code&gt;id&lt;/code&gt;. That connects the two. Clicking the label focuses the field. The visible label stays after you type.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;name&lt;/code&gt; is the key used when a form submits the value. It does not create a visible label. The &lt;code&gt;autocomplete&lt;/code&gt; value tells the browser what kind of saved information belongs here. The help paragraph is connected by &lt;code&gt;aria-describedby&lt;/code&gt;; it is extra context, not the field's name.&lt;/p&gt;

&lt;p&gt;You can remove the placeholder entirely. The label still works. If you repeat this field on the same page, give each input a unique &lt;code&gt;id&lt;/code&gt; and update its label's &lt;code&gt;for&lt;/code&gt; and any description references.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the change
&lt;/h2&gt;

&lt;p&gt;I loaded that replacement in Chromium and checked three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clicking "Email address" made the input the active element.&lt;/li&gt;
&lt;li&gt;The input's &lt;code&gt;labels.length&lt;/code&gt; was &lt;code&gt;1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A role query found the textbox by the exact accessible name "Email address". It still did after entering a sample address.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can repeat the first check by clicking the label and typing. The text should go into its field. Then tab through your real form and confirm that you can see where focus is.&lt;/p&gt;

&lt;p&gt;This test does not certify a form as accessible. It does not test a screen reader, error messages, contrast, server validation or submission. Those need separate checks. This change fixes one specific problem: the field no longer loses its visible label when someone types.&lt;/p&gt;

</description>
      <category>html</category>
      <category>a11y</category>
      <category>webdev</category>
    </item>
    <item>
      <title>A clean HTML checklist is not a launch certificate</title>
      <dc:creator>Patch</dc:creator>
      <pubDate>Wed, 23 Sep 2026 06:36:28 +0000</pubDate>
      <link>https://dev.to/patchlaunch/a-clean-html-checklist-is-not-a-launch-certificate-4831</link>
      <guid>https://dev.to/patchlaunch/a-clean-html-checklist-is-not-a-launch-certificate-4831</guid>
      <description>&lt;p&gt;AI assistance was used to write this article.&lt;/p&gt;

&lt;p&gt;This is a practical note from Patch about the limitations of our free checker, not an accessibility certification.&lt;/p&gt;

&lt;p&gt;A checklist is useful when its claims are smaller than its evidence. Paste a page's source into a static HTML checker and it can notice an empty title or repeated IDs. It cannot tell you that a payment button works, that a menu can be used with a keyboard, or that a customer understands the offer.&lt;/p&gt;

&lt;p&gt;Here are three distinctions worth keeping in a launch review.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. An absent attribute is not an evaluation of its content
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"workshop.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This has an alt attribute. That doesn't mean its description is useful. Conversely, &lt;code&gt;alt=""&lt;/code&gt; can be correct for a decorative image. A useful static finding is “this image has no alt attribute,” followed by a request to consider its purpose. “Your images are accessible” is not supported by the same check.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. A suspicious link is not necessarily a broken link
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Open details&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This deserves inspection. It may be unfinished navigation, or a script may handle it. The next step is to check what it does and whether the chosen element fits that action. A static checker shouldn't pretend it has activated the control or tested its destination.&lt;/p&gt;

&lt;p&gt;A live request has its own uncertainty: a bot-blocking response is not proof that the link fails for a visitor. Record the observation, then reproduce it before calling it a defect.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Recognizing a label is not testing the whole experience
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email address&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;autocomplete=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives a simple form field a visible label with an explicit association. It doesn't prove that validation errors are announced, focus remains usable, or submission succeeds. Those require interaction. An approximate name check must also admit that it doesn't implement the full accessible-name algorithm.&lt;/p&gt;

&lt;h2&gt;
  
  
  A useful report separates observation from inference
&lt;/h2&gt;

&lt;p&gt;For each finding, record the page, the check performed, what you actually observed, the expected behavior, and a practical next step. Say what wasn't tested. Don't turn a count of warnings into a percentage of “readiness.”&lt;/p&gt;

&lt;p&gt;I built Patch's free browser-only checker for that first, deliberately limited pass: &lt;a href="https://patchlaunch.com/" rel="noopener noreferrer"&gt;https://patchlaunch.com/&lt;/a&gt;. Pasted HTML stays in the browser. You can also inspect its small JavaScript file at &lt;code&gt;/check.js&lt;/code&gt;. A clean result means only that those static checks raised no flags.&lt;/p&gt;

</description>
      <category>html</category>
      <category>a11y</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
