<?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: Praise Agbabiaka</title>
    <description>The latest articles on DEV Community by Praise Agbabiaka (@praiztech).</description>
    <link>https://dev.to/praiztech</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1177654%2F3dda3c81-77fc-4fc1-8a05-93d4488c0e1e.jpg</url>
      <title>DEV Community: Praise Agbabiaka</title>
      <link>https://dev.to/praiztech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/praiztech"/>
    <language>en</language>
    <item>
      <title>Building a Component Library: From First Component to Fully Automated Pipeline</title>
      <dc:creator>Praise Agbabiaka</dc:creator>
      <pubDate>Tue, 19 May 2026 21:20:19 +0000</pubDate>
      <link>https://dev.to/praiztech/building-a-component-library-from-first-component-to-fully-automated-pipeline-4dg4</link>
      <guid>https://dev.to/praiztech/building-a-component-library-from-first-component-to-fully-automated-pipeline-4dg4</guid>
      <description>&lt;p&gt;I was asked to architect and build a React component library from the ground up.&lt;/p&gt;

&lt;p&gt;The problem was clear. We kept rebuilding the same components across different applications. The same buttons, inputs, modals, and layouts, recreated from scratch every time. Someone needed to own a component library and that someone ended up being me.&lt;/p&gt;

&lt;p&gt;I nodded like I had a plan. I didn't.&lt;/p&gt;

&lt;p&gt;I'd never built a component library before. I didn't know how to structure one, how to distribute one, or honestly how to scope one. But I figured the best way to learn was to start.&lt;/p&gt;

&lt;p&gt;So I started small. Buttons. Inputs. The boring stuff that touches everything.&lt;/p&gt;

&lt;p&gt;I focused on getting the foundations right, and I made the decision very early on that accessibility would be baked in from day one. Every component designed to be usable by keyboard users, screen readers, and other assistive technologies from the start. Not as a future improvement. Not as a "nice to have." Just part of the standard.&lt;/p&gt;

&lt;p&gt;Then, the library kept growing.&lt;/p&gt;

&lt;p&gt;Today, it's documented and hosted in Storybook, published as an npm package, and fully automated with CI/CD pipelines that handle Storybook deployments and npm publishing on every release.&lt;/p&gt;

&lt;p&gt;What started as a vague ask turned into real infrastructure the team relies on daily.&lt;/p&gt;

&lt;p&gt;A few things I'd tell anyone starting from zero:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don't need to know everything upfront. Start with the smallest components and let the architecture reveal itself.&lt;/li&gt;
&lt;li&gt;Treat accessibility like functionality. If it doesn't work with a keyboard, it's not done.&lt;/li&gt;
&lt;li&gt;Automate early. Setting up CI/CD for publishing and deployment saved me more time than I expected.&lt;/li&gt;
&lt;li&gt;Document everything. Storybook isn't just a demo tool. It's how the team actually adopts the library.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The gap between "I have no idea what to do" and "this is running in production" is smaller than you think. It's just a lot of small steps.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>a11y</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Building My First Wagtail Site</title>
      <dc:creator>Praise Agbabiaka</dc:creator>
      <pubDate>Mon, 30 Oct 2023 04:09:01 +0000</pubDate>
      <link>https://dev.to/praiztech/building-my-first-wagtail-site-3hj7</link>
      <guid>https://dev.to/praiztech/building-my-first-wagtail-site-3hj7</guid>
      <description>&lt;p&gt;Software development is an ever-changing field. Often, one has to pick up new technologies rather quickly. This was the case for me with Wagtail. And thanks to its simplicity, I was able to do so in no time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Wagtail?
&lt;/h2&gt;

&lt;p&gt;An opportunity to improve the accessibility of websites built with Wagtail opened up recently. And I immediately jumped on it. I was so excited at the prospect of putting my accessibility skills to use that I didn’t give much thought to the fact that I had no experience with Wagtail. I figured I could pick up Wagtail quickly enough if I put my mind to it. And since I learn best by doing, I decided to build a blog site to gain hands-on experience with Wagtail.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Wagtail?
&lt;/h2&gt;

&lt;p&gt;Wagtail is an open-source Content Management System built on Django. So, much of the process for building websites with Django translates directly to Wagtail. But Wagtail abstracts the need to define &lt;code&gt;urls&lt;/code&gt;, &lt;code&gt;views&lt;/code&gt; and &lt;code&gt;admin&lt;/code&gt; functionality. In Wagtail, emphasis is placed on page and page content. Every page is built from a Django model that inherits from Wagtail’s &lt;code&gt;Page&lt;/code&gt; model. Wagtail also provides a number of custom template tags and filters that extend the capabilities of the Django templating engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Blog Site
&lt;/h2&gt;

&lt;p&gt;I decided that my blog site would have a home page, a blog index page, blog post pages, and an about page. Since a home app comes out of the box with Wagtail, I only had to create a base and blog app for my Wagtail project.&lt;/p&gt;

&lt;p&gt;In the home app, I updated the &lt;code&gt;HomePage&lt;/code&gt; model to include fields for a hero image, heading, introduction and link to the blog index page. I defined the image and link fields as a &lt;code&gt;Foreignkey&lt;/code&gt; to Wagtail’s &lt;code&gt;Image&lt;/code&gt; and &lt;code&gt;Page&lt;/code&gt; models, respectively.&lt;/p&gt;

&lt;p&gt;As the name suggests, the base app defined functionalities shared across apps within the project. It contained &lt;code&gt;snippets&lt;/code&gt; for the site logo, main menu and breadcrumb navigation. Within this app, I constructed a &lt;code&gt;ContentBlock&lt;/code&gt; that allowed me to dynamically add subheading, image, list and rich text content to a page. This &lt;code&gt;ContentBlock&lt;/code&gt; inherited from &lt;code&gt;StreamBlock&lt;/code&gt;. It was used to define a &lt;code&gt;StreamField&lt;/code&gt; to populate the body field of the about and blog post pages. Because the about page didn’t belong in the home or blog app, I defined a &lt;code&gt;StandardPage&lt;/code&gt; model to create it.&lt;/p&gt;

&lt;p&gt;The blog app held models and templates for the blog index page and blog post pages. I defined the &lt;code&gt;BlogPage&lt;/code&gt; model as child page of the &lt;code&gt;BlogIndexPage&lt;/code&gt;. And I populated the blog index page with meta data for each blog post. Thus, a new blog site was built.&lt;/p&gt;

&lt;p&gt;I’m glad that I can now add Wagtail to my toolkit as a web developer. If you’d like to see my code, check out the &lt;a href="https://github.com/praiztech/praiztech_blog" rel="noopener noreferrer"&gt;praiztech_blog repository on GitHub&lt;/a&gt;. I'm still working on the front-end, though.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>webdev</category>
      <category>python</category>
      <category>django</category>
    </item>
    <item>
      <title>Growing My Skill in Web Accessibility</title>
      <dc:creator>Praise Agbabiaka</dc:creator>
      <pubDate>Fri, 27 Oct 2023 12:21:44 +0000</pubDate>
      <link>https://dev.to/praiztech/growing-my-skill-in-web-accessibility-2bij</link>
      <guid>https://dev.to/praiztech/growing-my-skill-in-web-accessibility-2bij</guid>
      <description>&lt;p&gt;As a self-taught web developer, my first impulse whenever I encounter a new concept is to search the Web. There's almost always a blog post or video that explains it in enough detail to help me understand. For the most part, this has been no different for web accessibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Online Resources
&lt;/h2&gt;

&lt;p&gt;Once I learnt about &lt;a href="https://developer.mozilla.org/en-US/docs/Learn/Accessibility" rel="noopener noreferrer"&gt;web accessibility on Mozilla&lt;/a&gt;, it was quite easy to find other related posts. I found several excellent posts to expand my knowledge of accessible web development. I learnt to write accessible code with semantic Hypertext Markup Language (HTML) elements. I also learnt to test my websites with automated testing tools such as WAVE, axe DevTools and ARC Toolkit. To understand how blind users experience my websites, I learnt to test with NVDA and TalkBack screen readers. I also learnt to enhance the output of screen readers with Accessible Rich Internet Applications (ARIA) when there are no HTML alternatives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning from a Great Mentor
&lt;/h2&gt;

&lt;p&gt;As my knowledge of web accessibility grew, I realized that I was lacking an important skill. I didn't know how to perform a manual accessibility audit. I searched the Web but I couldn't find a simple guide on the process of manual accessibility testing. Yet, I knew I had to gain this skill. Manual auditing is the only way to identify all accessibility issues on a website.&lt;/p&gt;

&lt;p&gt;So, when Rachele DiTullio posted on LinkedIn that they had created &lt;a href="https://racheleditullio.com/projects/accessibility-testing/" rel="noopener noreferrer"&gt;manual accessibility audit videos&lt;/a&gt;, I was excited. First, I watched the videos to understand their testing process. Then, I sent them an email requesting their mentorship. They were very receptive and agreed to mentor me. They agreed to provide weekly testing exercises and give feedback on the results. Thus began my journey into manual web accessibility auditing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwzthbqwtwsfibuj8v6gp.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwzthbqwtwsfibuj8v6gp.PNG" alt="A worksheet in a manual accessibility testing workbook showing the scope of the test" width="800" height="326"&gt;&lt;/a&gt;&lt;br&gt;&lt;strong&gt;My first manual accessibility testing workbook&lt;/strong&gt;
  &lt;/p&gt;

&lt;h2&gt;
  
  
  The Journey So Far
&lt;/h2&gt;

&lt;p&gt;As I've performed manual accessibility audits, my skill have evolved over time. I've learnt to break down each webpage into smaller sections to test. I'm learning to better interpret the Web Content Accessibility Guidelines (WCAG). I'm learning how WCAG failures impact the web experience of users with disabilities. It's a journey. I'm getting better at it. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>webaccessibility</category>
      <category>accessiblecode</category>
      <category>a11y</category>
    </item>
  </channel>
</rss>
