<?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: Progress Telerik</title>
    <description>The latest articles on DEV Community by Progress Telerik (@telerik).</description>
    <link>https://dev.to/telerik</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%2F78953%2F320a1e4a-4b63-43d4-b0df-740cb16f9f6c.jpg</url>
      <title>DEV Community: Progress Telerik</title>
      <link>https://dev.to/telerik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/telerik"/>
    <language>en</language>
    <item>
      <title>Angular Basics: How To Get the Value of a Selected Dropdown Menu Item</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Thu, 10 Jul 2025 07:51:22 +0000</pubDate>
      <link>https://dev.to/progresstelerik/angular-basics-how-to-get-the-value-of-a-selected-dropdown-menu-item-18ea</link>
      <guid>https://dev.to/progresstelerik/angular-basics-how-to-get-the-value-of-a-selected-dropdown-menu-item-18ea</guid>
      <description>&lt;p&gt;&lt;em&gt;Brought to you by the team behind &lt;a href="https://www.telerik.com/kendo-angular-ui?utm_campaign=dt_blog_syndication&amp;amp;utm_source=medium&amp;amp;utm_medium=content_syndication" rel="noopener noreferrer"&gt;Kendo UI for Angular&lt;/a&gt; — a complete set of enterprise-grade Angular components that help you design visually stunning, accessible and high-performing apps faster. Originally published at the &lt;a href="https://www.telerik.com/blogs/angular-basics-how-to-get-value-selected-dropdown-menu-item?utm_campaign=dt_blog_syndication&amp;amp;utm_source=medium&amp;amp;utm_medium=content_syndication" rel="noopener noreferrer"&gt;Telerik blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Have you ever had to ask, “How do I get the value of the selected dropdown menu item in Angular?” Let’s answer that!&lt;/p&gt;

&lt;p&gt;In Angular apps, the dropdown is a typical HTML element used in forms and components to allow users to select values. Today, we will learn three ways to get the value of the user’s selected item in a dropdown list with Angular.&lt;/p&gt;

&lt;p&gt;Our three approaches are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using a change event&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;ngModel&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;ViewChild&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our example app has three components with the same HTML markup, a dropdown with a list of NBA teams, and one property, selectedTeam, on the TypeScript file. We will implement each solution to assign the selected value from the dropdown to the selectedTeam variable.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TeamWithChangeEventComponent: Uses the HTML change event and template reference.&lt;/li&gt;
&lt;li&gt;TeamUsingViewChildComponent: Uses the viewChild decorator and template reference.&lt;/li&gt;
&lt;li&gt;TeamWithNgmodelComponent: Uses the ng-model directive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The HTML markup looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="col"&amp;gt;
&amp;lt;p&amp;gt;You select your team {{ selectedTeam }} using viewChild&amp;lt;/p&amp;gt;
    &amp;lt;select #teams (change)="onSelected()"&amp;gt;
        &amp;lt;option default&amp;gt;Pick a team&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Lakers&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Miami&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Cleveland&amp;lt;/option&amp;gt;
    &amp;lt;/select&amp;gt;
&amp;lt;/div&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the TypeScript file will have the variable selectedTeam.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    selectedTeam = '';
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s work with the first solution TeamWithChangeEventComponent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the Change Event and Template Reference Variables
&lt;/h2&gt;

&lt;p&gt;To work with this approach, we first use HTML reference variables to read the value and the dropdown event change, listen when the user changes the selection in the dropdown, and create a new method onSelected to assign the value to selectedTeam.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How to Build Modern Angular Dropdowns in Minutes with Kendo UI&lt;/strong&gt;&lt;br&gt;
Go beyond HTML select by &lt;a href="https://www.telerik.com/blogs/learn-how-to-build-modern-angular-dropdowns-minutes-kendo-ui?utm_campaign=dt_blog_syndication&amp;amp;utm_source=medium&amp;amp;utm_medium=content_syndication" rel="noopener noreferrer"&gt;learning how to implement modern dropdowns&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;First, create the template variables for dropdown using #teams. Use the event binding to listen for the change event and link with the onSelect method.&lt;/p&gt;

&lt;p&gt;The onSelect method receives the reference variable and takes the value of the dropdown element.&lt;/p&gt;

&lt;p&gt;The code will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="col"&amp;gt;
&amp;lt;p&amp;gt;You select your team {{ selectedTeam }} using change event&amp;lt;/p&amp;gt;
    &amp;lt;select #teams (change)="onSelected(teams.value)"&amp;gt;
        &amp;lt;option default&amp;gt;Pick a team&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Lakers&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Miami&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Cleveland&amp;lt;/option&amp;gt;
    &amp;lt;/select&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, create the onSelected(value) method in the TypeScript file. Take the value as a parameter and assign it to the selectedTeam variable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Component } from '@angular/core';
@Component({
    selector: 'app-team-with-change-event',
    templateUrl: './team-with-change-event.component.html',
    styleUrls: ['./team-with-change-event.component.css'],
})
export class TeamWithChangeEventComponent {
    selectedTeam = '';
    onSelected(value:string): void {
        this.selectedTeam = value;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How Does It Work?
&lt;/h3&gt;

&lt;p&gt;Angular uses event binding to link the method, and it gets the value from the parameter because it uses template reference to gain access to the dropdown HTML element.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can read more about &lt;a href="https://angular.io/guide/template-reference-variables" rel="noopener noreferrer"&gt;template reference variables&lt;/a&gt; and &lt;a href="https://angular.io/guide/event-binding" rel="noopener noreferrer"&gt;event binding in Angular&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Next, using the viewChild—let’s do it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Using viewChild and Template Reference Variable
&lt;/h2&gt;

&lt;p&gt;The new approach uses the @ViewChild decorator and template reference variables. In the new scenario, we create the template reference variable for the teams dropdown using #teams and listen for the (change) event. However, the method onSelected doesn’t require passing the value with a slight change.&lt;/p&gt;

&lt;p&gt;The HTML looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="col"&amp;gt;
&amp;lt;p&amp;gt;You select your team {{ selectedTeam }} using viewChild&amp;lt;/p&amp;gt;
    &amp;lt;select #teams (change)="onSelected()"&amp;gt;
        &amp;lt;option default&amp;gt;Pick a team&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Lakers&amp;lt;/option&amp;gt; 
        &amp;lt;option&amp;gt;Miami&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Cleveland&amp;lt;/option&amp;gt;
    &amp;lt;/select&amp;gt;
&amp;lt;/div&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In our TypeScript file, add the variable teams, using the decorator @ViewChild with type ElementRef and create the method onSelected() without parameters. But using the reference of teams, we can read the value of the reference of teams and assign it to the variable.&lt;/p&gt;

&lt;p&gt;The code will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Component, ElementRef, ViewChild } from '@angular/core';
@Component({
    selector: 'app-team-using-view-child',
    templateUrl: './team-using-view-child.component.html',
    styleUrls: ['./team-using-view-child.component.css'],
})
export class TeamUsingViewChildComponent {
    @ViewChild('teams') teams!: ElementRef;
    selectedTeam = '';
    onSelected():void {
        this.selectedTeam = this.teams.nativeElement.value;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  But How Does It Work?
&lt;/h3&gt;

&lt;p&gt;The ElementRef is a wrapper for the DOM HTML element, and the property nativeElement has a reference to the DOM object. Using the @ViewChild decorator, we get ElementRef in the component class.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Feel free to read more about the &lt;a href="https://v17.angular.io/api/core/ViewChild" rel="noopener noreferrer"&gt;ViewChild decorator&lt;/a&gt; and &lt;a href="https://v17.angular.io/api/core/ElementRef#description" rel="noopener noreferrer"&gt;ElementRef&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Using NgModel Directive
&lt;/h2&gt;

&lt;p&gt;Angular has another way to get the selected value in the dropdown using the power of ngModel and two-way data binding.&lt;/p&gt;

&lt;p&gt;The ngModel is part of the forms module. We need to import it into the NgModule list in the app.module, which will be available in our app.&lt;/p&gt;

&lt;p&gt;The ngModel directive helps us listen and update variables when the event changes trigger, and to use it, add the ngModel using [(ngModel)]="selectedTeam".&lt;/p&gt;

&lt;p&gt;Angular automatically gets the value and updates the variable selectedTeam using the ngModel approach when the user changes the value. We don’t need to create the onSelected method in our TypeScript file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="col"&amp;gt;
&amp;lt;p&amp;gt;You select your team {{ selectedTeam }}&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;The change Event&amp;lt;/p&amp;gt;
    &amp;lt;select [(ngModel)]="selectedTeam"&amp;gt;
        &amp;lt;option default&amp;gt;Pick a team&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Lakers&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Miami&amp;lt;/option&amp;gt;
        &amp;lt;option&amp;gt;Cleveland&amp;lt;/option&amp;gt;
    &amp;lt;/select&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How Does It Work?
&lt;/h3&gt;

&lt;p&gt;First, the ngModel directive uses the ControlValueAccessor, because Angular provides access to all HTML form elements like input, select and checkbox by default. It sends the value, and the two-way data binding creates the link between the value and the variable.&lt;/p&gt;

&lt;p&gt;If you want to read more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://v17.angular.io/api/forms/NgModel" rel="noopener noreferrer"&gt;NgModel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v17.angular.io/guide/two-way-binding#how-two-way-binding-works" rel="noopener noreferrer"&gt;Two-way data binding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v17.angular.io/api/forms/SelectControlValueAccessor" rel="noopener noreferrer"&gt;SelectControlValue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://v17.angular.io/api/forms/ControlValueAccessor" rel="noopener noreferrer"&gt;ControlValueAccessor&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We built three different ways to work with dropdowns in our apps. You can find a full code example for this article and play with the example app in the following links:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/danywalls/dropdowns-in-angular" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://stackblitz.com/edit/angular-ivy-mdajjb?file=src%2Findex.html" rel="noopener noreferrer"&gt;StackBliz&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to save your time and create fast and advanced dropdowns, then I recommend visiting the article about &lt;a href="https://www.telerik.com/blogs/learn-how-to-build-modern-angular-dropdowns-minutes-kendo-ui?utm_campaign=dt_blog_syndication&amp;amp;utm_source=medium&amp;amp;utm_medium=content_syndication" rel="noopener noreferrer"&gt;Angular Dropdowns in Minutes with Kendo UI&lt;/a&gt;—it shows you how to use &lt;a href="https://www.telerik.com/kendo-angular-ui/components/dropdowns/dropdownlist?utm_campaign=dt_blog_syndication&amp;amp;utm_source=medium&amp;amp;utm_medium=content_syndication" rel="noopener noreferrer"&gt;Angular DropDownList&lt;/a&gt; in your apps.&lt;/p&gt;

&lt;p&gt;Thanks for your time. I hope you can see how many ways there are to work with dropdowns and pick the best for your app.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>New FREE Ebook: A Quick Guide to Expert .NET Reporting Tools</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Tue, 30 Jun 2020 03:59:49 +0000</pubDate>
      <link>https://dev.to/telerik/new-free-ebook-a-quick-guide-to-expert-net-reporting-tools-1d0e</link>
      <guid>https://dev.to/telerik/new-free-ebook-a-quick-guide-to-expert-net-reporting-tools-1d0e</guid>
      <description>&lt;p&gt;Visualizations have been helping people understand data for centuries. Clear and accurate reporting tools play a pivotal role in any business decision today and help companies digitize and streamline their reporting process.&lt;/p&gt;

&lt;p&gt;Today’s data visualization tools, also called reporting tools, go beyond the standard charts and graphs used in the earlier periods. They can display data in more sophisticated ways such as infographics, dials and gauges, geographical maps, heat maps, and detailed bar, pie, and other charts. This is due to the advancement of digital information in today’s business environment.&lt;/p&gt;

&lt;p&gt;Business processes and people are moving information at incredible speeds thanks to the adoption of digital information. This has forced businesses to adopt digital workflows to exchange information quickly. An example of this might be stock brokerage or bank transactions are done all digitally with the only bottleneck being data transfer rates.&lt;/p&gt;

&lt;p&gt;An organization like a bank or an accounting firm or any other company which uses data for business decisions requires reporting tools that meet specific criteria to operate these high-end digital workflows. A proper reporting solution is of the utmost importance to ensure streamlined processes and accurate information is delivered.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.telerik.com/campaigns/reporting/wp-ebook-expert-.net-reporting-tools" rel="noopener noreferrer"&gt;Our guide to expert .NET reporting tools&lt;/a&gt; was just published and &lt;strong&gt;it is ready for FREE download.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this ebook, Eric Rohler, Senior Technical Engineer at Progress, offers a six-step framework to help you choose the best reporting tool for your organization. He reviews the main functionalities of reporting solutions and shares best practices for everything you need to know to deliver beautiful, powerful, interactive and reusable reports. &lt;/p&gt;

&lt;p&gt;Learn how to apply the top six criteria when assessing a reporting tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Presentation&lt;/li&gt;
&lt;li&gt;Powerful&lt;/li&gt;
&lt;li&gt;Productive&lt;/li&gt;
&lt;li&gt;Pliable&lt;/li&gt;
&lt;li&gt;Performant&lt;/li&gt;
&lt;li&gt;Price&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deep dive in different stages of reporting—from report creation to styling to data sources to integration to rendering and accessibility. Take advantage of expert advice on successful integration between Reporting tools and web (Blazor, ASP.NET Core, ASP.NET MVC, ASP.NET WebForms, Angular, React and more) or desktop applications (WPF, WinForms, UWP) and many practical examples and use cases.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.telerik.com/campaigns/reporting/wp-ebook-expert-.net-reporting-tools" rel="noopener noreferrer"&gt;Download FREE Reporting Ebook&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you download the ebook, we’ll soon follow up with an invitation to a dedicated reporting webinar and more materials on the topic. Stay tuned!&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>reporting</category>
      <category>reports</category>
    </item>
    <item>
      <title>Can We Make Open Source More Sustainable?</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Fri, 06 Mar 2020 04:58:47 +0000</pubDate>
      <link>https://dev.to/progresstelerik/can-we-make-open-source-more-sustainable-101a</link>
      <guid>https://dev.to/progresstelerik/can-we-make-open-source-more-sustainable-101a</guid>
      <description>&lt;p&gt;If you’re a software developer, you might not realize that the economics behind open source make zero sense to most people.&lt;/p&gt;

&lt;p&gt;For example, consider this conversation I had with a normal person a few days ago.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Me: “Sorry I’m a bit late. Crazy day at work”.&lt;/p&gt;

&lt;p&gt;Friend: “Ah, no worries, what’s up though?”&lt;/p&gt;

&lt;p&gt;Me: “We’re just trying to decide between three different JavaScript frameworks for that project, and the deadline is next week so we have to pick soon.&lt;/p&gt;

&lt;p&gt;Friend: “Ah, gotcha. Well which framework is the cheapest?”&lt;/p&gt;

&lt;p&gt;Me: “Oh they’re all free.”&lt;/p&gt;

&lt;p&gt;Friend:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In most industries you pay for tools that help you do your job, yet in the software world—a world where there’s a ton of money involved—most of us build apps using a variety of free tools.&lt;/p&gt;

&lt;p&gt;The most popular text editor? Visual Studio Code—free. The most popular source-control provider? git—free. The most popular JavaScript libraries? React, Angular, Vue, and their competitors—all free. Although paid software very much exists, it’s amazing how much of our critical infrastructure has moved to free and open-source software over the last handful of years.&lt;/p&gt;

&lt;p&gt;And although this switch to free-and-open-source tools has been enormously beneficial for developers, and for software in general, this same shift has also had consequences. In this article I’ll discuss one of those consequences: a problematic economic model, and I’ll discuss what I think we can do about it.&lt;/p&gt;

&lt;p&gt;Let’s start this discussion by taking a brief look at how we ended up with the open-source model we have today.&lt;/p&gt;

&lt;h2&gt;
  
  
  How did this happen?
&lt;/h2&gt;

&lt;p&gt;To give you a sense of how much times have changed, here are a few &lt;a href="https://www.cnet.com/news/microsoft-raps-open-source-approach/" rel="noopener noreferrer"&gt;quotes from Microsoft executives&lt;/a&gt; from the early 2000s that haven’t aged well.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Open source is an intellectual-property destroyer. I can't imagine something that could be worse than this for the software business and the intellectual-property business.”&lt;/p&gt;

&lt;p&gt;— Jim Allchin, former Windows chief&lt;/p&gt;

&lt;p&gt;“As history has shown, while this type of model (open source) may have a place, it isn't successful in building a mass market and making powerful, easy-to-use software broadly accessible to consumers”&lt;/p&gt;

&lt;p&gt;— Craig Mundie, former Microsoft senior vice president&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Although it’s easy to laugh at these quotes today, they weren’t very radical opinions at the time. Even though open source was already an established and growing concept by 2000, most companies primarily used paid solutions to build applications.&lt;/p&gt;

&lt;p&gt;I started my career in software in the early 2000s, and my first job involved an IBM-based IDE for writing Java code, a proprietary source-control solution that I’d prefer not to remember, and an IBM mainframe to host our production apps.&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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Frad-developer.jpg%3Fsfvrsn%3Db10fb693_0" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Frad-developer.jpg%3Fsfvrsn%3Db10fb693_0" title="rad-developer" alt="rad-developer" width="1366" height="768"&gt;&lt;/a&gt; &lt;em&gt;IBM’s Rational Application Developer. I used it in the early 2000s, and it’s still around today.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;All of these tools cost money—a lot of money—but they were deemed an acceptable expense because the tools provided enough value to warrant their cost.&lt;/p&gt;

&lt;p&gt;The switch to open source happened slowly throughout the following decade. Companies increasingly realized that open-source tools like MySQL and Apache were not only viable, but oftentimes better than the commercial products they were paying big money for.&lt;/p&gt;

&lt;p&gt;My personal experience for this transformation was on the web, which in the mid 2000s was the wild west compared to the web we have today. Web developers were tasked with supporting a dizzying set of browsers, ranging from the newly released Internet Explorer 7, to the venerable IE6, as well as Firefox, an open-source browser that was starting to challenge Microsoft’s stranglehold on the browser market.&lt;/p&gt;

&lt;p&gt;The tools developers built to manage the complexity of cross-browser development included the likes of Dojo, MooTools, jQuery, and many others.&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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fjquery-2007.png%3Fsfvrsn%3D155cc26e_0" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fjquery-2007.png%3Fsfvrsn%3D155cc26e_0" title="jquery-2007" alt="jquery-2007" width="867" height="744"&gt;&lt;/a&gt;&lt;em&gt;The jQuery homepage in June of 2007&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And while these frameworks took different approaches and used different APIs, they had one important thing in common: they were all free and open source.&lt;/p&gt;

&lt;p&gt;Whereas more established development ecosystems—Java, .NET, etc—were still conflicted about the benefits of open source, the web was built on free-and-open-source software from its onset.&lt;/p&gt;

&lt;p&gt;This was a boon to new web developers like me, as it meant I could instantly start tinkering with Dojo and jQuery at home, and even start using them at my corporate day job—a place where I was used to paying for the software tools I needed.&lt;/p&gt;

&lt;p&gt;And it wasn’t just me who jumped at the chance to use these new libraries. jQuery usage exploded in the late 2000s, and created an enormous ecosystem of jQuery plugins that built upon what jQuery had started. The overwhelming majority of these plugins were free and open source, as that had become the expectation for any web framework or plugin by this point.&lt;/p&gt;

&lt;p&gt;This new generation of web software inspired a lot of developers—myself included—and helped build the web into the dominant platform it is today. But this expectation that all software must be free and open-source helped to create one problem we have with open source today: a problematic economic and funding structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open source and economics
&lt;/h2&gt;

&lt;p&gt;Open source projects often start as a passion project for an individual or a small group, which they then share with the world for free. The fact that this is commonplace in the software world is actually kind of awesome.&lt;/p&gt;

&lt;p&gt;But that doesn’t mean that the work these developers do is 100% altruistic. The primary incentive to working on an open-source project today is career advancement. For example, many former members of the jQuery team now have prominent roles at major tech companies. Several &lt;a href="https://www.freecodecamp.org/news/between-the-wires-an-interview-with-mootools-contributors-33d764957575/" rel="noopener noreferrer"&gt;MooTools contributors now work on React at Facebook&lt;/a&gt;. Personally, I worked on jQuery UI for two years, and that involvement helped me get the job I have today at Progress.&lt;/p&gt;

&lt;p&gt;There’s nothing inherently wrong with career advancement as the primary incentive to work on open source, but it can become problematic when the project author(s) achieve some success. Because, as it turns out, once you’ve achieved whatever notoriety you had in mind, suddenly dealing with random GitHub issues no longer feels like the best way to spend your Saturday nights.&lt;/p&gt;

&lt;p&gt;In this situation, many developers try to gather donations to cover their time and effort. For example, if you look back at jQuery’s site from 2007, notice how there was already a donation button on the bottom-left corner of the screen.&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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fjquery-donate.png%3Fsfvrsn%3D4af4047f_0" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fjquery-donate.png%3Fsfvrsn%3D4af4047f_0" title="jquery-donate" alt="jquery-donate" width="867" height="744"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Dojo project had a similar donation on their site dating back to the same time frame.&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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fdojo8a822851ffc24038a6a8493ae905b5bf.png%3Fsfvrsn%3D529ff8bf_0" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fdojo8a822851ffc24038a6a8493ae905b5bf.png%3Fsfvrsn%3D529ff8bf_0" title="dojo" alt="dojo" width="981" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today, these calls for donations more typically happen through Patreon, or through some form of sponsorship, which projects like ESLint and Vue.js use. Perhaps the most notorious example occurs in the popular &lt;a href="https://github.com/zloirock/core-js" rel="noopener noreferrer"&gt;core-js library&lt;/a&gt;, which includes an overt donation request every time you install the library, and which has generated &lt;a href="https://github.com/zloirock/core-js/issues/548" rel="noopener noreferrer"&gt;some controversy&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thank you for using core-js ( https://github.com/zloirock/core-js ) for polyfilling JavaScript standard library!

The project needs your help! Please consider supporting of core-js on Open Collective or Patreon: 
&amp;gt; https://opencollective.com/core-js 
&amp;gt; https://www.patreon.com/zloirock 

Also, the author of core-js ( https://github.com/zloirock ) is looking for a good job -)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In an even more controversial move, last year the &lt;a href="https://github.com/standard/standard" rel="noopener noreferrer"&gt;Standard JavaScript project&lt;/a&gt; &lt;a href="https://www.zdnet.com/article/popular-javascript-library-starts-showing-ads-in-its-terminal/" rel="noopener noreferrer"&gt;started showing ads every time you installed its package&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I guess we now live in the post-"ads in the npm install log" era &lt;a href="https://t.co/pSnBnMDNSg" rel="noopener noreferrer"&gt;pic.twitter.com/pSnBnMDNSg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— Quine atom (@qntm) &lt;a href="https://twitter.com/qntm/status/1165344132728066048?ref_src=twsrc%5Etfw" rel="noopener noreferrer"&gt;August 24, 2019&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As you might expect, &lt;a href="https://github.com/standard/standard/issues/1381" rel="noopener noreferrer"&gt;developers weren’t too happy about the ad&lt;/a&gt;, and &lt;a href="https://www.zdnet.com/article/npm-bans-terminal-ads/" rel="noopener noreferrer"&gt;npm quickly took action&lt;/a&gt;—banning any package that “display ads at runtime, on installation, or at other stages of the software development lifecycle, such as via npm scripts.”&lt;/p&gt;

&lt;p&gt;Regardless of what you think about ads in your npm logs, there’s one thing we can probably all agree on: from an economics perspective, the idea that authors want money for their work shouldn’t be surprising at all.&lt;/p&gt;

&lt;p&gt;In today’s open-source world there’s a massive disconnect between the amount of value projects like core-js and Standard provide, and the financial proceeds maintainers earn in return for their effort.&lt;/p&gt;

&lt;p&gt;With that background in mind, let’s look at what I believe are three different ways we could attempt to solve this funding gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 1: Foundations
&lt;/h2&gt;

&lt;p&gt;The oldest solution to open-source funding comes in the form of foundations. The most well-known foundation is the &lt;a href="https://www.linuxfoundation.org" rel="noopener noreferrer"&gt;Linux Foundation&lt;/a&gt;, which was founded in 2000, and which today has &lt;a href="https://www.linuxfoundation.org/membership/members/" rel="noopener noreferrer"&gt;a crazy number of corporate members&lt;/a&gt;. The foundation supports some of the biggest open-source projects out there, from Linux itself, to Node.js, to jQuery, and just about everything in between.&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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Flinux-foundation-projects.png%3Fsfvrsn%3Dd869e8de_0" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Flinux-foundation-projects.png%3Fsfvrsn%3Dd869e8de_0" title="linux-foundation-projects" alt="linux-foundation-projects" width="1495" height="1033"&gt;&lt;/a&gt;&lt;em&gt;The Linux Foundation supports development on a &lt;a href="https://www.linuxfoundation.org/projects/" rel="noopener noreferrer"&gt;ton of projects&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Although the Linux Foundation is the largest software foundation, there are a variety of others for more specialized software technologies or fields. For example, the &lt;a href="https://dotnetfoundation.org/" rel="noopener noreferrer"&gt;.NET Foundation&lt;/a&gt; helps support .NET projects, and &lt;a href="https://www.finos.org/" rel="noopener noreferrer"&gt;FINOS&lt;/a&gt;, the Fintech Open Source Foundation, supports open-source projects in the financial space.&lt;/p&gt;

&lt;p&gt;Although these foundations have done unquestionable good, and are the reason that big open-source projects like Linux stay maintained, they’re not a silver-bullet solution to solving open-source funding.&lt;/p&gt;

&lt;p&gt;Perhaps the biggest issue with foundations is the sheer breadth of projects they support. If you’re a company and you pay money to join a foundation—and it’s usually a whole lot of money—you’re relying on the foundation to allocate those funds into the individual open-source projects appropriately. And when there are a crazy number of projects these foundations support, there’s no guarantee that your money will go to projects your company uses or cares about. There’s also some chance that your money will go into a competitor’s open source project or initiative.&lt;/p&gt;

&lt;p&gt;Because of this, I see foundations as an excellent solution for large established projects, such as Linux, Node.js and jQuery, but less useful for less-established open-source projects. But the good news is, there’s another model aimed at these smaller projects that’s gotten a lot of attention lately: subscriptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 2: Subscriptions
&lt;/h2&gt;

&lt;p&gt;Subscriptions have long been a popular way for open-source project authors to raise money to support their work.&lt;/p&gt;

&lt;p&gt;In the early 2000s, services like PayPal were popular for one-time donations and recurring payments. More recently, Patreon popularized a subscription model for funding open-source projects, and a number of different subscription platforms now compete to provide a similar service.&lt;/p&gt;

&lt;p&gt;For example, the &lt;a href="https://opencollective.com/" rel="noopener noreferrer"&gt;Open Collective platform&lt;/a&gt; launched in 2016, offering a funding model that revolves around public donations.&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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fopen-collective.png%3Fsfvrsn%3D4ab3732e_0" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fopen-collective.png%3Fsfvrsn%3D4ab3732e_0" title="open-collective" alt="open-collective" width="1333" height="848"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today, an impressive set of projects use Open Collective, including projects like &lt;a href="https://opencollective.com/bootstrap" rel="noopener noreferrer"&gt;Bootstrap&lt;/a&gt; and &lt;a href="https://opencollective.com/core-js" rel="noopener noreferrer"&gt;core-js&lt;/a&gt;. Because the donations on Open Collective are public, they provide a rare view into how much money some of these projects actually take in. For example, here are the top financial contributors to Bootstrap on Open Collective.&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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fbootstrap-funding.png%3Fsfvrsn%3D7b92f20_0" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fbootstrap-funding.png%3Fsfvrsn%3D7b92f20_0" title="bootstrap-funding" alt="bootstrap-funding" width="1027" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What I like about this model is it offers an incentive for organizations to sponsor projects—and that incentive is appearing on the list of top financial contributors. For example, I had no idea what Segment was, but I looked up the service after seeing they were the No. 2 funder of Bootstrap.&lt;/p&gt;

&lt;p&gt;Open Collective is not the only player in this space, as last year GitHub debuted &lt;a href="https://github.com/sponsors" rel="noopener noreferrer"&gt;GitHub Sponsors&lt;/a&gt;, an open-source sponsorship program built into GitHub itself. GitHub has a pretty big competitive advantage for making GitHub Sponsors succeed, as GitHub itself has been the canonical place to host open-source projects over the last decade.&lt;/p&gt;

&lt;p&gt;To GitHub’s credit though, they do take steps to ensure their program gets positioned alongside competing donation services. For example, any project on GitHub can now create a &lt;code&gt;.github/FUNDING.yml&lt;/code&gt; file, and in that file you can &lt;a href="https://help.github.com/en/github/administering-a-repository/displaying-a-sponsor-button-in-your-repository" rel="noopener noreferrer"&gt;list all the sponsorship options your repository offers&lt;/a&gt;—whether those options are GitHub Sponsors or not.&lt;/p&gt;

&lt;p&gt;If you do, GitHub will display a “sponsor” button on your repository, which lists all those sponsorship options for your users. For example, here’s what that process looks like for the &lt;a href="https://github.com/zloirock/core-js" rel="noopener noreferrer"&gt;core-js GitHub repository&lt;/a&gt;.&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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fsponsorship-flow.png%3Fsfvrsn%3D5b2283a7_0" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fsponsorship-flow.png%3Fsfvrsn%3D5b2283a7_0" title="sponsorship-flow" alt="sponsorship-flow" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last service I want to discuss appears last in the screenshot above, &lt;a href="https://dev.to(https:)"&gt;Tidelift&lt;/a&gt;, which has a rather unique offering. Tidelift is a ~$1,500 monthly subscription product that provides something they call “managed open source,” which Tidelift’s website describes in three parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;. We provide tools to keep track of all the dependencies you use, flag issues, and enforce policies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Management&lt;/strong&gt;. We manage core, mission-critical packages on your behalf, including researching and resolving issues so you don't have to anymore&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainers&lt;/strong&gt;. We recruit maintainers for many important projects and pay them to proactively prevent problems and address the root causes of issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m a bit skeptical of this approach, both because it feels like an indirect way of supporting open-source maintainers, and because I don’t see much incentive for companies to subscribe. Nevertheless, I do like that there are companies out there trying innovative new ways to create a different open-source funding model. And I should also note that &lt;a href="https://news.crunchbase.com/news/tidelift-raises-25m-series-b-just-seven-months-after-last-funding/" rel="noopener noreferrer"&gt;Tidelift has raised a shocking $40 million dollars in funding&lt;/a&gt;, so there are investors out there that think Tidelift’s model has some real potential.&lt;/p&gt;

&lt;p&gt;Overall, perhaps the biggest reason to be optimistic about the future of subscription services is the current number of competitors. More competitors means more ideas, and if economics works like it should, the best ideas will find their way to more and more projects. And the fact that GitHub is now involved, and providing &lt;strong&gt;sponsor&lt;/strong&gt; buttons on repositories, will help ensure that these sponsorship services remain visible.&lt;/p&gt;

&lt;p&gt;The reason to be pessimistic about subscription services is they rely heavily on goodwill. Convincing companies to donate money is not easy, and even though these subscription services offer incentives, such as appearing on a list of top donors, I believe they’ll need to offer companies more in return for their cash.&lt;/p&gt;

&lt;p&gt;Before wrapping up our tour of open-source funding solutions, I want to discuss one final option you might not have thought about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 3: Paying for software
&lt;/h2&gt;

&lt;p&gt;In researching this article I read a lot of opinions on how to fix open-source economics, and none of them included the simplest economic solution: having companies pay for the software they use directly.&lt;/p&gt;

&lt;p&gt;I have a lot of personal experience with both free and paid software, as I’ve spent my career with both, and over time I’ve gone from a die-hard open-source fan, to being far more pragmatic about when paying for software makes sense—largely because I’ve seen the difficulty of funding open-source projects firsthand.&lt;/p&gt;

&lt;p&gt;I was a member of the free-and-open-source &lt;a href="https://jqueryui.com/" rel="noopener noreferrer"&gt;jQuery UI&lt;/a&gt; project for two years, and am proud that our components helped web developers around the world build better apps. But at the same time, I also saw that when maintainers’ interest goes away, and when sponsorship money can no longer cover the bills, a project can quickly die off. Today, jQuery UI is technically part of the Linux Foundation, but the project’s last release happened in 2016.&lt;/p&gt;

&lt;p&gt;I then worked as part of the free-and-open-source &lt;a href="https://www.nativescript.org/" rel="noopener noreferrer"&gt;NativeScript&lt;/a&gt; project for five years, and our framework has helped tons of JavaScript developers build iOS and Android apps. But while working on NativeScript I learned how hard it is to finance a framework when you make no money directly—especially when you compete with the likes of Facebook’s React Native and Google’s Flutter, companies that have a seemingly endless budget and zero revenue goals.&lt;/p&gt;

&lt;p&gt;As a contrast to my work on jQuery UI and NativeScript, for the last several months I’ve switched over to work on the &lt;a href="https://www.telerik.com/kendo-react-ui/" rel="noopener noreferrer"&gt;KendoReact team&lt;/a&gt;, where we sell premium UI components to React developers. Whereas with jQuery UI and NativeScript I had trouble explaining the finances around everything I did, with KendoReact it’s quite simple: developers pay us money, and in return, we give them a suite of awesome user interface components.&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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fkendo-react.png%3Fsfvrsn%3D64457c1d_0" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fkendo-react.png%3Fsfvrsn%3D64457c1d_0" title="kendo-react" alt="kendo-react" width="1342" height="1057"&gt;&lt;/a&gt;&lt;em&gt;A sample app showing off several KendoReact UI components. You can try it for yourself &lt;a href="https://telerik.github.io/kendo-react-finance-portfolio/#/stocks" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Paid software has a number of benefits. By paying, you get a number of assurances you don’t from a random project you find on GitHub—for example guaranteed updates, more consistent APIs, and a company you can get contact when things inevitably go wrong.&lt;/p&gt;

&lt;p&gt;That doesn’t mean that paid software is perfect. Charging money for software makes it harder to build a community, as you’ll never have as many paying customers as you will have free users. Receiving payments also requires you to have some corporate infrastructure, which can be onerous for small projects.&lt;/p&gt;

&lt;p&gt;For these reasons I’m not suggesting that all, or even most software charge money. Open source software has done a lot of good for the world, and should continue to be the way we develop most of our software. But I do believe that paid software has a place, and shouldn’t be something that developers immediately reject out of principle.&lt;/p&gt;

&lt;p&gt;Along with foundations and donations, charging money for software should be seen as a viable way to fund software projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;In today’s software world there’s a huge disconnect between the value open-source projects provide, and the financial compensation they receive in return.&lt;/p&gt;

&lt;p&gt;This disconnect has spurred the creation of a number of services to attempt to make open-source economics more sane. Foundations help ensure large open-source projects continue to run, and subscription services can help smaller open-source project maintainers pay their bills.&lt;/p&gt;

&lt;p&gt;My hope is that, in general, we can encourage companies to increasingly pay for the software they use. These payments can come in the form of foundation memberships, subscriptions to open-source projects, or through payments to the software they use directly. Hopefully, the ongoing innovation in this space will help make these payments easier, and encourage more corporations to give back to an industry they benefit from enormously. If they do, it’ll help us explain how open source works to our friends and families a lot easier.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Web Accessibility Guidebook for Developers</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Tue, 09 Jul 2019 18:24:37 +0000</pubDate>
      <link>https://dev.to/telerik/web-accessibility-guidebook-for-developers-2ep8</link>
      <guid>https://dev.to/telerik/web-accessibility-guidebook-for-developers-2ep8</guid>
      <description>&lt;h2&gt;
  
  
  Introduction to Accessibility
&lt;/h2&gt;

&lt;p&gt;In the process of implementing &lt;a href="https://www.telerik.com/kendo-react-ui/components/accessibility/" rel="noopener noreferrer"&gt;accessibility compliance&lt;/a&gt; (Section 508, WCAG 2.0 and WAI-ARIA) for &lt;a href="https://www.telerik.com/kendo-react-ui/" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt;, our suite of native UI components for React, we learned a lot about both fundamental and advanced accessibility topics. With this article, our goal is to introduce fellow engineers, regardless of level, to web accessibility and share our practical knowledge and best practices.&lt;/p&gt;

&lt;p&gt;By the W3C definition, accessibility means that websites, tools, and technologies are designed and developed so that people with disabilities can use them. More specifically, people can: perceive, understand, navigate, and interact with the Web, and contribute to the Web.&lt;/p&gt;

&lt;p&gt;One good example for accessibility is if you can use your site without looking at it. How would all the features and details you spent hours on developing work if you couldn’t use your eyesight to consume the content or use the mouse to interact with it? Imagine instead that you would need to listen to a screen reader that describes the UI and that navigation may not be through the traditional mouse or keyboard input.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Accessibility is Often Neglected
&lt;/h3&gt;

&lt;p&gt;While there are many reasons why accessibility is not omnipresent, although ideally it should be, there are three reasons that stick out.&lt;/p&gt;

&lt;p&gt;First, it’s hard to accommodate for something that you don’t understand well. Most of the time, it is not motivation that we lack, but rather education on how disabilities prevent people from interacting with our site. This includes lack of knowledge around what disability types exist and how to accommodate them. We just do not know the ins and outs of the problem.&lt;/p&gt;

&lt;p&gt;Second, making your application accessible requires a lot of work. Starting from understanding the premises of the standards you need to follow all the way to designing the needed features and functionalities into your app. Then of course, there’s testing whether your approach has yielded the desired result – and much of the testing can only be done manually. The practices described in this article will make this effort easier, but we are still talking about a serious undertaking.&lt;/p&gt;

&lt;p&gt;Third is the economic argument which, rightly or not, dominates modern decision making: in most cases, a minority of your clients (or users) would be affected by a disability, which serves as justification to postpone implementing those accessibility improvements for the next release. It’s far easier for a business to justify focusing effort on something that benefits the majority rather than serving a smaller subset of users with improvements that may feel like the application did not actually move forward.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Accessibility is Important
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Ethics
&lt;/h4&gt;

&lt;p&gt;People with disabilities deal with a lot of challenges on a daily basis. If they are among your clients or users, enabling them to interact with your web app is plain human decency.&lt;/p&gt;

&lt;h4&gt;
  
  
  Market
&lt;/h4&gt;

&lt;p&gt;There's data that &lt;strong&gt;1 billion people worldwide&lt;/strong&gt; , and &lt;strong&gt;20% of all internet users&lt;/strong&gt; , have some form of disability. This is still a minority, but it comprises of a lot more people than most of us would think.&lt;/p&gt;

&lt;h4&gt;
  
  
  Legal
&lt;/h4&gt;

&lt;p&gt;As legislation in this domain develops, it becomes more and more likely for your business to be required by law to be accessible. We will come back to this as the next section focuses on this exact topic.&lt;/p&gt;

&lt;h4&gt;
  
  
  User Experience
&lt;/h4&gt;

&lt;p&gt;Accessibility guidelines are designed to help people access and use your website more easily. As a side effect, most of them improve usability and directly benefit all users, including those without disabilities. For example, readable text helps not only people with poor sight, but all users.&lt;/p&gt;

&lt;h4&gt;
  
  
  Engineering
&lt;/h4&gt;

&lt;p&gt;Many of the good practices for accessibility are good engineering and design principles in general. Often it is the poorly written code that is not accessible. For those of us who strive for mastery of our craft, accessibility is just a matter of doing a good job.&lt;/p&gt;

&lt;h4&gt;
  
  
  Reputation
&lt;/h4&gt;

&lt;p&gt;Having a more accessible site than your competition is a competitive advantage. It can also help create goodwill towards your brand.&lt;/p&gt;

&lt;h4&gt;
  
  
  SEO
&lt;/h4&gt;

&lt;p&gt;There is some overlap between good practices for SEO and web accessibility. For example, writing semantic HTML with proper use of descriptive attributes such as labels, video transcription, image captioning and using title and header tags all improve both a website’s SEO and its accessibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  Legislation
&lt;/h3&gt;

&lt;p&gt;Current legislation across the globe is moving in a direction where accessibility is becoming a mandatory feature of the web. In the USA, accessibility is covered by the Americans with Disabilities Act (&lt;a href="https://www.ada.gov/" rel="noopener noreferrer"&gt;ADA&lt;/a&gt;). Many developed countries have similar laws, for example, the UK has the &lt;a href="http://www.legislation.gov.uk/ukpga/2010/15/contents" rel="noopener noreferrer"&gt;Equality Act of 2010&lt;/a&gt;. In practical terms, these laws mean that public sector organizations and businesses are required by law to follow the &lt;a href="https://www.w3.org/WAI/standards-guidelines/wcag/" rel="noopener noreferrer"&gt;Web Content Accessibility Guidelines (WCAG)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s not just your customers and users you should be thinking about. If your organization has 50 or more employees, you need to ensure that you accommodate any individuals with disabilities. This means your internal web tools will have to be accessible as well.&lt;/p&gt;

&lt;p&gt;Additionally, if you are a contractor working for the government, you need to comply with &lt;a href="https://www.section508.gov/" rel="noopener noreferrer"&gt;Section 508 of the Rehabilitation Act&lt;/a&gt; in your work in addition to the above. By law, all US government services need to follow Section 508.&lt;/p&gt;

&lt;p&gt;These laws are not just an indication of good intentions. More and more law firms take legal actions based on accessibility legislation. Progress has a detailed article on the topic for further reading, called “&lt;a href="https://dev.to/telerik/accessibility-and-the-law-164c-temp-slug-7160342"&gt;Accessibility and the Law&lt;/a&gt;.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Disabilities and Accessibility Best Practices
&lt;/h2&gt;

&lt;p&gt;There are four major disability types - &lt;strong&gt;hearing&lt;/strong&gt; , &lt;strong&gt;sight&lt;/strong&gt; , &lt;strong&gt;motor&lt;/strong&gt; and &lt;strong&gt;cognitive&lt;/strong&gt; disabilities. Each type includes a multitude of conditions. They cause different challenges when interacting with the web and require different approaches to solve these challenges. Let’s explore some best practices addressing each separate type of disability. You will notice that most of these practices are not about the underlying technology we use but about how we design our software. This means that everyone involved in the development process can contribute to better accessibility.&lt;/p&gt;

&lt;h4&gt;
  
  
  Hearing (Auditory) Disabilities
&lt;/h4&gt;

&lt;p&gt;Hearing disabilities range from mild hearing loss to deafness. The best way to help these users is to avoid relying only on sound to convey critical information. Instead, add another media in parallel for support. For example, if you use video, make sure it supports subtitles with full captions. If you use audio, provide a transcript. Subtitles and transcripts should be full and not miss critical lines. In a later paragraph, we will list guidelines for readability. They strongly apply to subtitles and transcripts. In addition to this, for both video and audio, make sure background noise is minimized, so that the conveyed information is as audible as possible.&lt;/p&gt;

&lt;h4&gt;
  
  
  Visual Disabilities - Low Vision
&lt;/h4&gt;

&lt;p&gt;The primary way to accommodate for low vision is to have a readable interface. UI elements need to be big and clear. Text is more complex, though, and in a later paragraph, we will list guidelines for readability. They are designed to assist people with low vision.&lt;/p&gt;

&lt;p&gt;Contrast is another important aspect. High contrast between elements and colors in the UI will help people with low vision. There are tools available that examine if contrast is sufficient for people with this condition. Here you can find the &lt;a href="https://www.w3.org/WAI/ER/tools/" rel="noopener noreferrer"&gt;tools recommended by the Web Accessibility Initiative (WAI)&lt;/a&gt;. In most page designs used nowadays, contrast is indeed problematic. Below is an example of a high contrast theme that complies with WCAG. Such high contrast will not work well with regular themes and you would probably prefer not to sacrifice the visual appeal of your site. A good compromise is to include a high-contrast theme as an option on your website, much like the option to change the language.  &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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fcontrast.png%3Fsfvrsn%3D35e2e94e_1" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fcontrast.png%3Fsfvrsn%3D35e2e94e_1" title="Web accessibility - Contrast" alt="Web accessibility - Contrast" width="670" height="654"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Visual Disabilities - Blindness
&lt;/h4&gt;

&lt;p&gt;Blind people use screen readers. These applications parse the HTML and describe it to the user using natural language. Developing for screen readers has its specifics, so a later section in the article will focus exclusively on them. Additionally, the input device a user with blindness will work with will be different. Using a mouse requires sight. A blind person will need full keyboard support instead.&lt;/p&gt;

&lt;h4&gt;
  
  
  Visual Disabilities - Colorblindness
&lt;/h4&gt;

&lt;p&gt;Colorblindness, too, is not a single condition - there are different types of colorblindness. Keep in mind that the following explanations are quite simplified. Deuteranomaly is the difficulty to perceive green light and is the most common. Having difficulty perceiving red light is called protanomaly and is a bit less common. The visible specters of these two conditions are somewhat similar and the conditions are more commonly known as red-green colorblindness. Tritanomaly is a problem with perception of blue colors and is very rare.&lt;/p&gt;

&lt;p&gt;The severity of each condition also varies - they can range from a slight perception problem to full inability to perceive that color. We use the prefix -nomaly when the color perception is partially affected and – nopia when a color cannot be perceived at all. Achromatopsia is the condition of seeing everything in greyscale and is very rare. Changes in color perception do not affect a single color but the whole visible spectrum.  &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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fhow-a-color-blind-person-sees-the-world.png%3Fsfvrsn%3D25a31cd7_1" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fhow-a-color-blind-person-sees-the-world.png%3Fsfvrsn%3D25a31cd7_1" title="How a color-blind person sees" alt="Types of colorblindness" width="670" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your initial idea may be to pick colors that most people with colorblindness can see. This is not ideal because of the numerous variations of the disability, but orange and blue work ok in most cases. This is one of the reasons why the internet loves blue so much.&lt;/p&gt;

&lt;p&gt;There are tools that simulate how your site looks when seen by colorblind people. You can use them to detect if there is a problem and then design and add optional themes for problematic types of the condition. This still requires your user to be able to find and switch to the respective theme.&lt;/p&gt;

&lt;p&gt;Your most efficient solution is to not rely on color alone to convey critical information. You can design around the problem by using shapes, symbols, animation, and other creative means.&lt;/p&gt;

&lt;h4&gt;
  
  
  Motor Disabilities
&lt;/h4&gt;

&lt;p&gt;Fast and/or repetitive actions, actions that require holding a button, actions with time limits - all of these are hard for people with motor disabilities and can cause physical pain. You need to avoid them, but it is not so simple. The following example illustrates why: imagine you have a slider that requires you to hold a button to move. Your solution may be to allow the slider to move by tapping a key, but if the step is too small, the result will be a repetitive action that is not much of an improvement. The general rule is that you need to design a website so a user would be able to conveniently use it both with a keyboard only and with a mouse only.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cognitive Disabilities Related to Motion Sickness and Sensory Overload (Example - Epilepsy)
&lt;/h4&gt;

&lt;p&gt;There are several patterns that can cause motion sickness or sensory overload. Usually these are rapid effects such as shaking, bright lights, quickly flashed (three times/second or faster). Repeating movement patterns, rapid or not, can cause the same issues. A good example for a repetitive but slow movement on a page is an animation of falling snowflakes, which we often see around the winter holidays. Sharp changes using flashy transitions in the contents on a page are also problematic; we need to use smooth transitions instead. A good practice is to avoid problematic effects, but if you want to use them, allow users to disable them as a compromise.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cognitive Disabilities - Learning Difficulties
&lt;/h4&gt;

&lt;p&gt;Simplicity is key. Make your scenarios simple, make your interface simple and free of clutter. Use simple language, avoid fancy words. Always provide clear instructions with concise information. The amount of information should follow the Goldilocks principle – too little will not be enough, but add too much and some users will get distracted. Avoid time limits that can put unnecessary pressure on the user.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cognitive Disabilities - Dyslexia
&lt;/h4&gt;

&lt;p&gt;Dyslexia is a type of disability that makes it difficult for some people to read: dyslexic people may confuse letters or see them rotated or crowded together. In the following paragraphs, we will list guidelines for readability. They strongly apply to addressing the challenges of dyslexia.  &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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fdyslexia.png%3Fsfvrsn%3D914c6482_1" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fdyslexia.png%3Fsfvrsn%3D914c6482_1" title="Cognitive disabilities - Dyslexia " alt="Accessibility - Dyslexia" width="670" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Tips on Readability
&lt;/h4&gt;

&lt;p&gt;Good readability ensures your website will be accessible for a number of people with disabilities: readable subtitles and transcripts will be of help to people with hearing problems and readable text in general will be of help to people with low vision or dyslexia. A rule of thumb is to use simple and clean sans-serif font in a large font size.&lt;/p&gt;

&lt;p&gt;Space matters. For example, long lines are hard to read, so apply a limit of 70 characters per line. For subtitles, the recommended limit is 35 characters. Provide enough space for characters to breathe - 1.5x line spacing is ok. On the topic of space, text in all capital letters is hard to read, so use mixed case. Reading speed also matters, so do not advance text automatically or in the case of subtitles - keep them on the screen for at least 0.3 seconds per word.&lt;/p&gt;

&lt;p&gt;A key part of the puzzle is contrast. Background images usually obscure text. Good fonts have a border around the letters to enhance contrast, but it is even better to avoid background images altogether and provide a solid background that contrasts well with the text.&lt;/p&gt;

&lt;p&gt;The IT industry has created awesome and free specialized fonts that are optimized for readability. You may consider some of them. &lt;a href="https://opendyslexic.org/" rel="noopener noreferrer"&gt;Opendyslexic&lt;/a&gt; and &lt;a href="https://rsms.me/inter/" rel="noopener noreferrer"&gt;Inter&lt;/a&gt; are good examples.  &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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fopendyslexic.png%3Fsfvrsn%3D83a9d45a_1" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fopendyslexic.png%3Fsfvrsn%3D83a9d45a_1" title="OpenDyslexic specialized font - dyslexia" alt="OpenDyslexic specialized font" width="670" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction to Assistive Technology
&lt;/h2&gt;

&lt;p&gt;Assistive technology is the industry term that includes all software and hardware designed to help people with disabilities. Input devices include mouth sticks, head wands, big trackballs, specialized keyboards, voice recognition software. Output devices include screen magnifiers, screen readers, braille displays, hearing aids, software with natural language interfaces and more. Some of these enhance an existing technology, others provide an alternative way to interact with a computer.  &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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fdevices4e4730fb07714f0892b9b8b95e227d78.png%3Fsfvrsn%3D2022fd2d_1" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fdevices4e4730fb07714f0892b9b8b95e227d78.png%3Fsfvrsn%3D2022fd2d_1" title="Assistive devices - keyboard" alt="Assistive devices - keyboard" width="670" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most assistive technologies work on the level of the operating system and web developers do not need to do anything additional to enable them to function properly. However, with screen readers things tend to be a little more complicated. What screen readers do, in essence, is parse the HTML, then describe and explain it using natural language. The quality of that voice description depends directly on the quality of the code. So, naturally, screen readers are a primary concern for web developers working on making their websites more accessible. In the following paragraphs we will look at some of the best practices when optimizing our web assets for screen readers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optimizing for Screen Readers
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Write Semantic HTML
&lt;/h4&gt;

&lt;p&gt;The best practice to help screen readers do their job properly is to write semantic HTML – that is, to write valid HTML, follow best practices and use elements according to their intended purpose. For example, if something looks and behaves like a button, make it a button, not a &lt;/p&gt;. If it is a heading, use the  tags and not some inline CSS.

&lt;p&gt;The formal definition of the semantics of html elements can be found in &lt;a href="https://html.spec.whatwg.org/multipage/" rel="noopener noreferrer"&gt;the living standard of HTML&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In real life, this is not so simple, of course. This brings us to the next sections.&lt;/p&gt;

&lt;h4&gt;
  
  
  Follow the Spec
&lt;/h4&gt;

&lt;p&gt;As with any fundamental technology, the Internet has multiple standardizing bodies. The &lt;a href="https://www.w3.org/" rel="noopener noreferrer"&gt;World Wide Web Consortium (W3C)&lt;/a&gt; is one of them and the &lt;a href="https://www.w3.org/WAI/" rel="noopener noreferrer"&gt;Web Accessibility Initiative (WAI)&lt;/a&gt;) is part of it. We as developers need to follow the &lt;a href="https://www.w3.org/WAI/standards-guidelines/wcag/" rel="noopener noreferrer"&gt;Web Content Accessibility Guidelines (WCAG)&lt;/a&gt;, developed by WAI, which is the general standard for web accessibility.&lt;/p&gt;

&lt;p&gt;The design practices we went over earlier when discussing the different types of disabilities are described in greater detail in WCAG. It’s important to note that WCAG is a living standard that is actively being improved. The most recent version as of the time of writing this resource is 2.1.&lt;/p&gt;

&lt;p&gt;WAI developed the &lt;a href="https://www.w3.org/WAI/standards-guidelines/aria/" rel="noopener noreferrer"&gt;Web Accessibility Initiative - Accessible Rich Internet Applications Suite (WAI-ARIA),&lt;/a&gt;) the technical standard for how to write our code. We as developers need to follow this spec for screen readers to work properly. For brevity, in the next paragraphs I will refer to WCAG and WAI-ARIA as “the spec.”&lt;/p&gt;

&lt;h4&gt;
  
  
  Automated Testing
&lt;/h4&gt;

&lt;p&gt;There are a variety of scanners that can automatically do checks covering many of the compliance rules that we are required to follow. For example, most automation software can easily scan for missing attributes and elements, check color contrasts or validate the HTML. A good practice is to do at least a quarterly scan of your site. And if you are really dedicated, you can include this step in your CI and CD process. Here is a list of good-quality scanners in no particular order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/web/tools/lighthouse/" rel="noopener noreferrer"&gt;Google Lighthouse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.deque.com/axe/" rel="noopener noreferrer"&gt;Axe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wave.webaim.org/" rel="noopener noreferrer"&gt;Wave&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.powermapper.com/" rel="noopener noreferrer"&gt;Powermapper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dynomapper.com/" rel="noopener noreferrer"&gt;Dynomapper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://monsido.com/features/web-accessibility" rel="noopener noreferrer"&gt;Monsido&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/WAI/ER/tools/" rel="noopener noreferrer"&gt;Various other tools listed by W3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Manual Testing
&lt;/h4&gt;

&lt;p&gt;Unfortunately, automation can take just a small part of the big picture. If you want to achieve meaningful results, you have to manually test your site. The most practical way to perform such a test is to close your eyes and use only a keyboard and a screen reader to perform a variety of tasks on the website you’re reviewing.&lt;/p&gt;

&lt;p&gt;Side-note: Personally, this is the point when I discovered how difficult accessibility testing really is.&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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fblind-testing.png%3Fsfvrsn%3D3f056418_1" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fblind-testing.png%3Fsfvrsn%3D3f056418_1" title="Accessibility Blind Testing" alt="Accessibility - Blind Testing" width="670" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Navigation
&lt;/h4&gt;

&lt;p&gt;With your eyes closed, you cannot use a mouse. Keyboard navigation in the dark is much harder than with visual input. A lot of your solutions may not work as well as you had hoped once you stop seeing the screen. You will probably discover scenarios that you’ve missed accounting for. In short, offering good, working, keyboard navigation is very hard.&lt;/p&gt;

&lt;h4&gt;
  
  
  Auditory Complexity
&lt;/h4&gt;

&lt;p&gt;The market provides multiple screen readers and they are usually very hard to understand. You may struggle to make sense of what you hear. The reason is that screen readers do not just read the screen using text-to-speech. Their task is harder: they need to describe the UI in enough detail so you understand its structure. Screen readers can be understood well only when you provide them with simple constructs in simple scenarios. So you need to work very hard to simplify the information architecture of your site.&lt;/p&gt;

&lt;h4&gt;
  
  
  Inconsistencies
&lt;/h4&gt;

&lt;p&gt;Each screen reader has its own subtle interpretation of the spec and behaves slightly differently on each browser. You will encounter a lot of grey areas where following the spec is just not enough to make all screen readers provide meaningful output. In those cases, your implementation needs to make a compromise that works ok in most combinations of readers and browsers.  &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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fnvda-jaws-chromevox.png%3Fsfvrsn%3Da62aa04c_1" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fnvda-jaws-chromevox.png%3Fsfvrsn%3Da62aa04c_1" title="NVDA JAWS ChromeVox readers" alt="NVDA JAWS ChromeVox readers" width="670" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In our practice, we’ve discovered a few combinations that work well for testing purposes:&lt;/p&gt;

&lt;h5&gt;
  
  
  Jaws
&lt;/h5&gt;

&lt;p&gt;&lt;a href="http://www.freedomscientific.com/products/software/jaws/" rel="noopener noreferrer"&gt;Jaws&lt;/a&gt; is one of the oldest screen readers on the market. This means that it is one of the most popular tools out there. It has numerous users, so you need to make sure that your applications support it. But its age also means that Jaws needs to support a lot of legacy use cases. As a result, it is often not very compliant with the spec and difficult to work with. In our practice, we’ve found that Jaws works best with IE.&lt;/p&gt;

&lt;h5&gt;
  
  
  ChromeVox
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://chrome.google.com/webstore/detail/chromevox/kgejglhpjiefppelpmljglcjbhoiplfn" rel="noopener noreferrer"&gt;ChromeVox&lt;/a&gt; is the newest reader (as of the time of writing this article) and, consequently, most compliant with the spec. Its young age means it is still not very popular. It works best on Chrome.&lt;/p&gt;

&lt;h5&gt;
  
  
  NVDA
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://www.nvaccess.org/" rel="noopener noreferrer"&gt;NVDA&lt;/a&gt; is another new reader with good compliance with the spec. It is very popular and works best on Firefox.&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusion on Manual Testing
&lt;/h4&gt;

&lt;p&gt;When a reader works well with a browser, this gives you some confidence that its users will use it primarily on that browser, though there are no rules and the possible scenarios are many. However, given that we usually work with limited resources, a good practice is to focus only on the popular combinations above and test often, instead of covering all possible combinations of readers and browsers, but doing it less often.&lt;/p&gt;

&lt;p&gt;To back up our statements with data, here is a link to a reputable &lt;a href="https://webaim.org/projects/screenreadersurvey7/" rel="noopener noreferrer"&gt;screen reader user survey&lt;/a&gt; that sheds light on user adoption of screen readers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Third Party Testing is Last
&lt;/h3&gt;

&lt;p&gt;It is advisable that you test with people with disabilities or get accessibility feedback from clients. The best practice is to do this only after you have done your homework with in-house manual and automated testing. It is our responsibility to first make sure their user experience is not completely broken. Only then will you be able to get meaningful feedback from your users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Work Practices in Your Organization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Education
&lt;/h3&gt;

&lt;p&gt;The first step in addressing any problem, is first to become aware of it. That’s why it is recommended that you invest in educating your team on the topic. Regardless of our motivation to do the right thing, unless we know what needs to be done to make a website more accessible, we won’t achieve progress in this area.&lt;/p&gt;

&lt;p&gt;Additionally, accessibility is not a single person’s responsibility – everyone working on a web app, from engineers and designers to management, need to have it as a consideration. Educating and sharing knowledge with fellow engineers is also the primary motivation behind this article.&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentation
&lt;/h3&gt;

&lt;p&gt;As already discussed in previous parts, accessibility is not an exact science. You will often find yourself in a grey area without a clear solution in sight. The best practice in these situations is to document your approach. In that document, you may include the reasoning behind your current implementation and quote the WCAG rule(s) you’ve chosen to follow. This documentation will help your team to share knowledge and improve the consistency of your site and reduce the number of grey areas. Should you ever need to defend your decisions in court, having documentation can help defend your case.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.telerik.com/kendo-react-ui/" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt; is one of a suite of JavaScript UI libraries called &lt;a href="https://www.telerik.com/kendo-ui" rel="noopener noreferrer"&gt;Kendo UI&lt;/a&gt;. At Progress, we share code and knowledge across teams to make sure when one team excels in something, the others will quickly get to the same level. Documentation is a very important part of how we share knowledge across teams when it comes to accessibility.&lt;/p&gt;

&lt;h4&gt;
  
  
  Usability and Accessibility are not the Same
&lt;/h4&gt;

&lt;p&gt;Usability and accessibility have a lot in common. Most accessibility practices discussed in this article will benefit all users. But usability and accessibility are not the same. You may have invested heavily in usability, but that does not mean that you have automatically covered accessibility as well. Be aware that accessibility needs its own attention.&lt;/p&gt;

&lt;p&gt;This is our recommended reading on usability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The US government provides research-based &lt;a href="https://webstandards.hhs.gov/guidelines" rel="noopener noreferrer"&gt;web design and usability guidelines&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;“Humane Interface” by Jeff Raskin is considered a fundamental work on the topic&lt;/li&gt;
&lt;li&gt;“Don't Make Me Think” by Steve Krug is a wonderful short book&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As we have previously discussed, accessibility has multiple grey areas. Sometimes accessibility solutions may contradict usability solutions. The best practice in those cases is to not sacrifice usability, as it usually targets a larger number of users. Instead, we need to be creative and work around the problem.&lt;/p&gt;

&lt;h4&gt;
  
  
  Use Accessible Tools
&lt;/h4&gt;

&lt;p&gt;Web accessibility is hard. A key way to achieve good results is to use accessible tools. For example, if you want a simple blog or website, WordPress will take care of accessibility for you. With our work on KendoReact library of UI components, we aim to help you in the same way. Our UI components are &lt;a href="https://www.telerik.com/kendo-react-ui/components/accessibility/" rel="noopener noreferrer"&gt;designed and built from the ground up with accessibility in mind&lt;/a&gt;, so you do not have to do most of the heavy lifting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommended Resources
&lt;/h3&gt;

&lt;p&gt;Below, you can find relevant and authoritative resources I recommend for further reading on the topic&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/Understanding_WCAG" rel="noopener noreferrer"&gt;Mozilla's explanation of WCAG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://a11yproject.com/" rel="noopener noreferrer"&gt;The a11y Project&lt;/a&gt; – a major community-driven hub with resources and tools&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eu.udacity.com/course/web-accessibility--ud891" rel="noopener noreferrer"&gt;Free Accessibility course by Google&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/WAI/ER/tools/" rel="noopener noreferrer"&gt;Testing tools suggested by WAI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://knowbility.org/programs/accessu/2019/" rel="noopener noreferrer"&gt;AccessU&lt;/a&gt; is a reputed accessibility-focused summit &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://webaim.org/" rel="noopener noreferrer"&gt;WebAIM (web accessibility in mind)&lt;/a&gt; – an organization that provides accessibility services such as training, evaluation and certification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, Progress has a whitepaper on accessibility that explores the domain in great detail, called &lt;a href="https://www.telerik.com/campaigns/kendo-ui/wp-accessibility" rel="noopener noreferrer"&gt;Accessibility for Web Developers&lt;/a&gt;, which is free to download.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;This is the finale of our article on web accessibility, summarizing the experience of the &lt;a href="https://www.telerik.com/kendo-react-ui/" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt; team while working on the accessibility of our library of UI components for React. Our primary goal with this resource is to help build awareness on the topic. We hope that we have managed to convey how important accessibility is and have given you useful and practical ideas to efficiently tackle some of the challenges in building an accessible website. Please tell us about your experience with the topic in the comments below.&lt;/p&gt;

&lt;p&gt;May the Force of Accessibility be with you.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>webdev</category>
      <category>react</category>
      <category>kendoreact</category>
    </item>
    <item>
      <title>Unleash the Power of the KendoReact DatePicker Component</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Thu, 20 Jun 2019 16:04:28 +0000</pubDate>
      <link>https://dev.to/telerik/unleash-the-power-of-the-kendoreact-datepicker-component-40c4</link>
      <guid>https://dev.to/telerik/unleash-the-power-of-the-kendoreact-datepicker-component-40c4</guid>
      <description>&lt;p&gt;The KendoReact DatePicker is a flexible React UI component that lets you customize every aspect of it with a custom renderer. In this blog post we cover how to customize the Calendar component of the DatePicker to highlight the US federal holiday schedule.&lt;/p&gt;

&lt;p&gt;Let’s chat about dates in our React applications. Specifically, let’s chat about letting users select dates through a date picker. While there are a few choices out there, today we will be focusing on what is available in &lt;a href="https://www.telerik.com/kendo-react-ui/" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt;, a set of UI components designed and built from the ground up for React. In the demo we will use in this blog, we'll explore what a React DatePicker component can do using the &lt;a href="https://www.telerik.com/kendo-react-ui/components/dateinputs/datepicker/" rel="noopener noreferrer"&gt;KendoReact DatePicker&lt;/a&gt; as an example.&lt;/p&gt;

&lt;p&gt;Normally this component displays some sort of an input element, and when a user interacts with it, a calendar appears through a popup in order to help the user select a particular date. As a quick side-note, if you need to include a time selection, there exists the &lt;a href="https://www.telerik.com/kendo-react-ui/components/dateinputs/datetimepicker" rel="noopener noreferrer"&gt;DateTimePicker&lt;/a&gt; component and for working with a range of dates, you have the &lt;a href="https://www.telerik.com/kendo-react-ui/components/dateinputs/daterangepicker/" rel="noopener noreferrer"&gt;DateRangePicker&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Beyond just selecting dates, a DatePicker can also be a great way to showcase available and unavailable days. It also can highlight certain dates so your users are aware that something special might be going on that day. I don’t know about you, but I constantly have to look up if a particular day is a US holiday or not, so why not create a React DatePicker that showcases the 2019 US holiday schedule? Since everyone loves emoji, why not replace the rendered dates with an applicable one ( )?&lt;/p&gt;

&lt;h2&gt;
  
  
  #1 - Understand the Flexibility of the KendoReact DatePicker
&lt;/h2&gt;

&lt;p&gt;The KendoReact DatePicker is a React UI component that is extremely customizable. It allows the React developer to take full control over the look and feel of the component. It’s important to understand how this may differ from traditional configuration option customization. What is unique about this component is that it is composed of three parts and each of these parts can be &lt;strong&gt;completely overridden&lt;/strong&gt; and passed custom a custom renderer, meaning a developer has full control over the component while still maintaining underlying functionality.&lt;/p&gt;

&lt;p&gt;These parts are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DateInput&lt;/strong&gt; - the actual text box and input responsible for showcasing the date that was picked, or for displaying a mask when no input has been provided.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Popup&lt;/strong&gt; - the part of the UI component that allows for a calendar to appear when clicking in the DateInput or on the DatePicker icon.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calendar&lt;/strong&gt; - the actual calendar that is displayed within the above-mentioned popup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means that every single element of the KendoReact DatePicker can be tailor-made while still retaining the great underlying functionality of the component!&lt;/p&gt;

&lt;p&gt;Today, we’ll be focusing on the Calendar portion of the DatePicker, but what we learn can also be used to work with, and customize, the DateInput and Popup pieces of the DatePicker.&lt;/p&gt;

&lt;h2&gt;
  
  
  #2 - Creating our Custom Calendar
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Defining our Data
&lt;/h3&gt;

&lt;p&gt;First, let’s think about the data that we want to use. A simple search around the web will give us a list of all &lt;em&gt;federal holidays&lt;/em&gt; (in the US) and the days they fall upon during the 2019 calendar year. With that in mind, it makes sense to create an array of these days, with the &lt;strong&gt;name&lt;/strong&gt; of the holiday, the &lt;strong&gt;actual date&lt;/strong&gt; , as well as our &lt;strong&gt;emoji&lt;/strong&gt; of course!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const usHolidays = [
  { name: "New Year's Day", date: new Date("2019-01-01"), emoji: "" },
  { name: "Martin Luther King Day", date: new Date("2019-01-21"), emoji: "" },
  { name: "President's Day", date: new Date("2019-02-18"), emoji: "" },
  { name: "Memorial Day", date: new Date("2019-05-27"), emoji: "" },
  { name: "Independence Day", date: new Date("2019-07-04"), emoji: "" },
  { name: "Labor Day", date: new Date("2019-09-02"), emoji: "️" },
  { name: "Columbus Day", date: new Date("2019-10-14"), emoji: "" },
  { name: "Veterans Day", date: new Date("2019-11-11"), emoji: "️" },
  { name: "Thanksgiving Day", date: new Date("2019-11-28"), emoji: "" },
  { name: "Christmas Day", date: new Date("2019-12-25"), emoji: "" }
];

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Working with the KendoReact Calendar
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://www.telerik.com/kendo-react-ui/components/dateinputs/calendar/" rel="noopener noreferrer"&gt;KendoReact Calendar&lt;/a&gt; is a part of the KendoReact &lt;code&gt;DateInputs&lt;/code&gt; npm package, which is the package that we will use to add the DatePicker to our app. For those of you worried about overall package size (since multiple components are in a single package sometimes): don’t worry, that’s where tree shaking comes in!&lt;/p&gt;

&lt;p&gt;For these examples we are using the &lt;a href="https://www.telerik.com/kendo-react-ui/components/styling/theme-default/" rel="noopener noreferrer"&gt;KendoReact Default theme&lt;/a&gt;, but the &lt;a href="https://www.telerik.com/kendo-react-ui/components/styling/theme-bootstrap/" rel="noopener noreferrer"&gt;KendoReact Bootstrap theme&lt;/a&gt; and the &lt;a href="https://www.telerik.com/kendo-react-ui/components/styling/theme-material/" rel="noopener noreferrer"&gt;KendoReact Material theme&lt;/a&gt; can also be used. In this scenario we are including a link to the compiled CSS file in the &lt;code&gt;head&lt;/code&gt; tag of our &lt;code&gt;index.html&lt;/code&gt; file, but following the documentation articles for any of the themes highlights how to include this as a part of our overall application bundle process if you prefer that instead.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.telerik.com/kendo-react-ui/components/dateinputs/calendar/" rel="noopener noreferrer"&gt;KendoReact Calendar&lt;/a&gt; documentation page provides the installation instructions for the Calendar component. Going through this we can then create our first React component that we will be building on top of for the this demo application.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as React from 'react';
import { Calendar } from '@progress/kendo-react-dateinputs';

export class CustomCalendar extends React.Component {
  render() {
    return (
      &amp;lt;Calendar /&amp;gt;
    );
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which will render the following on the page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fblogs%2F2019%2F2019-06%2F001-calendar.png%3Fsfvrsn%3D17ecc367_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fblogs%2F2019%2F2019-06%2F001-calendar.png%3Fsfvrsn%3D17ecc367_1" title="Default KendoReact Calendar" alt="Default KendoReact Calendar showing June 2019"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating Custom Cells in the KendoReact Calendar
&lt;/h3&gt;

&lt;p&gt;It may be helpful to understand that the HTML for the KendoReact Calendar is a &lt;code&gt;table&lt;/code&gt; element filled with &lt;code&gt;td&lt;/code&gt; elements that represent each cell.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fblogs%2F2019%2F2019-06%2F002-calendar-table-layout.png%3Fsfvrsn%3D270daf84_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fblogs%2F2019%2F2019-06%2F002-calendar-table-layout.png%3Fsfvrsn%3D270daf84_1" title="HTML structure of a KendoReact Calendar" alt="Screenshot from chrome developer tools showing the HTML structure of a KendoReact calendar"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
 &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fblogs%2F2019%2F2019-06%2F003-calendar-inspector.png%3Fsfvrsn%3D74c4e45_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fblogs%2F2019%2F2019-06%2F003-calendar-inspector.png%3Fsfvrsn%3D74c4e45_1" title="KendoReact Calendar cell highlighted in chrome" alt="KendoReact Calendar cell highlighted in chrome for developer tools inspection"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;There are &lt;a href="https://www.telerik.com/kendo-react-ui/components/dateinputs/calendar/custom-rendering/" rel="noopener noreferrer"&gt;various ways to customize cells in the KendoReact Calendar&lt;/a&gt;, ranging from just adding additional information for each cell to completely taking over what is rendered in each cell. The latter is what we will be doing today. This means that in order to maintain the structure of the calendar whatever we return will need to be wrapped in a &lt;code&gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;/code&gt; element.&lt;/p&gt;

&lt;p&gt;For this we should create a new React component, &lt;code&gt;CustomCalendarCell&lt;/code&gt; and to make our life a little easier let’s start out with some boilerplate code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export class CustomCalendarCell extends React.Component {
  handleClick = () =&amp;gt; {
    this.props.onClick(this.props.value);
  }

  render() {
    // make weekends a bit opaque since a holiday calendar mostly focuses on what ADDITIONAL days we have off during the year (weekends are already off!)
    let style = {
        cursor: 'pointer',
        opacity: this.props.isWeekend ? .6 : 1
    };

    const className = classNames({
        'k-state-selected': this.props.isSelected,
        'k-state-focused': this.props.isFocused
    });

    return (
      &amp;lt;td
        onClick={this.handleClick}
        className={className}
        style={style}
      &amp;gt;
        &amp;lt;span className="k-link" title={this.props.isWeekend &amp;amp;&amp;amp; this.title}&amp;gt;
          {this.props.children}
        &amp;lt;/span&amp;gt;
      &amp;lt;/td&amp;gt;
    );
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can safely ignore &lt;code&gt;style&lt;/code&gt; and &lt;code&gt;className&lt;/code&gt; variables as they are only there to help with some styling options for our cells. &lt;code&gt;style&lt;/code&gt; just makes weekend days a bit more faded (since we have those days off anyways) and &lt;code&gt;className&lt;/code&gt; applies some KendoReact-specific CSS classes to the cells.&lt;/p&gt;

&lt;p&gt;This piece of code may have stuck out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;handleClick = () =&amp;gt; {
  this.props.onClick(this.props.value);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What we are doing here is working with the &lt;code&gt;onClick()&lt;/code&gt; event that will be passed down from the Calendar component itself. This ensures that selecting our cell will properly highlight said cell in our Calendar and set the value of the Calendar to the selected day.&lt;/p&gt;

&lt;p&gt;Everything else should be easy to follow. This will not change how the calendar renders normally (with the exceptions of the weekend days) so this is an excellent base to start from.&lt;/p&gt;

&lt;p&gt;Let’s start making this calendar our own!&lt;/p&gt;

&lt;p&gt;We already know the name and format of our data. So, let’s figure out how we can take this and check if the current date of the calendar cell is one of the holidays that we want to highlight. Something like this would work perfectly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let emoji;

// find our holidays and assign the proper emoji - a simple for loop should do!
for (let i = 0; i &amp;lt; usHolidays.length; i++) {
  if (usHolidays[i].date.getUTCFullYear() == this.props.value.getUTCFullYear() &amp;amp;&amp;amp; 
      usHolidays[i].date.getUTCMonth() == this.props.value.getUTCMonth() &amp;amp;&amp;amp; 
      usHolidays[i].date.getUTCDate() == this.props.value.getUTCDate()) {
    emoji = usHolidays[i].emoji;
    style.backgroundColor = "rgba(255, 50, 85, 0.3)";
    this.title = usHolidays[i].name;
    break;
  };
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What is happening here is that we create an &lt;code&gt;emoji&lt;/code&gt; variable, which will be &lt;code&gt;undefined&lt;/code&gt; if we are not on a holiday and will be assigned something if we have struck gold and have fallen on a holiday.&lt;/p&gt;

&lt;p&gt;When it comes to comparing dates we’ll keep it simple and just compare the current year, month, and day for each date. The current day of our cell comes from &lt;code&gt;this.props.value&lt;/code&gt; and is already in a date object, so we can just call &lt;code&gt;getUTCFullYear()&lt;/code&gt;, &lt;code&gt;getUTCMonth&lt;/code&gt;, and &lt;code&gt;getUTCDate()&lt;/code&gt; to compare our two dates. We use the UTC variants here to avoid issues around time zones for our sample.&lt;/p&gt;

&lt;p&gt;Once we have a match, we assign the holiday emoji to our &lt;code&gt;emoji&lt;/code&gt; variable, update the &lt;code&gt;style&lt;/code&gt; variable to have a background color (with &lt;code&gt;0.3&lt;/code&gt; as opacity), and define the &lt;code&gt;title&lt;/code&gt; of the day equal to the name of the holiday. On a regular day this would be written out like &lt;em&gt;“Monday, June 10th, 2019”&lt;/em&gt; and will appear both when hovering over an item and be used for accessibility purposes.&lt;/p&gt;

&lt;p&gt;We do have one last piece that we need to address, and that is how to use this match to update the cell content itself. This is done in the &lt;code&gt;render()&lt;/code&gt; function when we call &lt;code&gt;return&lt;/code&gt;. Right now we assume that we just have one type of cell, but what if we want to extend this to include a type for our emojis? Well, the easiest way would probably be to define a variable to represent our JSX outside of the &lt;code&gt;return&lt;/code&gt;, which changes based on whether we have a normal day or one of our holidays.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let renderSpan;

if(emoji) {
  renderSpan = &amp;lt;span className="k-link" title={this.title}&amp;gt;{emoji}&amp;lt;/span&amp;gt;;
}
else {
  renderSpan = &amp;lt;span className="k-link" title={this.props.title}&amp;gt;{this.props.children}&amp;lt;/span&amp;gt;;
}
return (
  &amp;lt;td
    onClick={this.handleClick}
    className={className}
    style={style}
  &amp;gt;
    {renderSpan}
   &amp;lt;/td&amp;gt;
);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we see above, &lt;code&gt;renderSpan&lt;/code&gt; becomes an important variable to ensure that we are rendering the correct content while still retaining many of the common props needed in the &lt;code&gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;/code&gt; element.&lt;/p&gt;

&lt;p&gt;To take advantage of &lt;code&gt;CustomCalendarCell&lt;/code&gt; we need to import it to our first component where we defined the calendar and define it as the cell renderer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as React from 'react';
import { Calendar } from '@progress/kendo-react-dateinputs';
import { CustomCalendarCell } from './customCalendarCell.jsx';

export class CustomCalendar extends React.Component {
  render() {
    return (
      &amp;lt;Calendar
        cell={CustomCalendarCell}
        value={this.props.value}
        onChange={this.props.onChange}
      /&amp;gt;
    );
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With all of this put together we can now navigate to any month with a holiday and see the fruits of our labor! Here’s January 2019 for example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fblogs%2F2019%2F2019-06%2F004-calendar-january-2019.png%3Fsfvrsn%3Deb8a6c2b_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fblogs%2F2019%2F2019-06%2F004-calendar-january-2019.png%3Fsfvrsn%3Deb8a6c2b_1" title="Custom KendoReact Calendar" alt="Custom KendoReact Calendar showcasing emojis for new year's day and martin luther king day"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note how hovering over the champagne bottle emoji gives us the “New Year’s Day” title!&lt;/p&gt;

&lt;p&gt;Here is everything put together so far in a project on &lt;a href="https://stackblitz.com/" rel="noopener noreferrer"&gt;StackBlitz&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  #3 - Adding our Custom Calendar to our React DatePicker
&lt;/h2&gt;

&lt;p&gt;With the Calendar being customized the hard part is over. At this point we can take advantage of the &lt;a href="https://www.telerik.com/kendo-react-ui/components/dateinputs/datepicker/custom-rendering/#toc-customizing-the-calendar" rel="noopener noreferrer"&gt;KendoReact DatePicker customization options&lt;/a&gt; and simply pass in our &lt;code&gt;CustomCalendar&lt;/code&gt; component.&lt;/p&gt;

&lt;p&gt;Let’s update our &lt;code&gt;main.jsx&lt;/code&gt; to import the &lt;code&gt;DatePicker&lt;/code&gt; component and update the &lt;code&gt;render()&lt;/code&gt; function to include the &lt;code&gt;DatePicker&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as React from 'react';
import * as ReactDOM from 'react-dom';

import { DatePicker } from '@progress/kendo-react-dateinputs';
import { CustomCalendar } from './customCalendar.jsx';

class App extends React.Component {

  render() {
    return (
      &amp;lt;DatePicker
        onBlur={this.handleBlur}
        calendar={CustomCalendar}
      /&amp;gt;
    );
  }
}
ReactDOM.render(
  &amp;lt;App /&amp;gt;,
  document.querySelector('my-app')
);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It really is that simple: define the &lt;code&gt;calendar&lt;/code&gt; prop of the &lt;code&gt;DatePicker&lt;/code&gt; equal to our new &lt;code&gt;CustomCalendar&lt;/code&gt; and we are already done!&lt;/p&gt;

&lt;p&gt;A note here is that the usage of &lt;code&gt;onBlur&lt;/code&gt; ensures that the proper propagation of the value changing will occur. So it’s just there to make the component works correctly even with our custom parts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fblogs%2F2019%2F2019-06%2F005-datepicker-calendar.gif%3Fsfvrsn%3D1b5db3b5_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fblogs%2F2019%2F2019-06%2F005-datepicker-calendar.gif%3Fsfvrsn%3D1b5db3b5_1" title="KendoReact Custom Calendar in the DatePicker" alt="Gif showcasing a custom calendar displayed within the popup of a date picker"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Like before, here’s the full project on StackBlitz.&lt;/p&gt;

&lt;h2&gt;
  
  
  #4 - Make Things Prettier with Tooltips
&lt;/h2&gt;

&lt;p&gt;While the current titles that pop up is a nice feature, it doesn’t really fit with the rest of the look-and-feel of our application. This is where something like the &lt;a href="https://www.telerik.com/kendo-react-ui/components/tooltip/" rel="noopener noreferrer"&gt;KendoReact Tooltip&lt;/a&gt; comes to the rescue! We can use this to take the same titles but make them appear in a Tooltip that fits our overall theme instead.&lt;/p&gt;

&lt;p&gt;As the KendoReact Tooltip demos showcases, normally this is done by just wrapping the element we want to tooltipify with the &lt;code&gt;&amp;lt;Tooltip&amp;gt;&amp;lt;/Tooltip&amp;gt;&lt;/code&gt; tags, but because we’re dealing with a form of popup on top of a popup we need to do some slight tweaks to the way we add the component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as React from 'react';
import * as ReactDOM from 'react-dom';

import { DatePicker } from '@progress/kendo-react-dateinputs';
import { Tooltip } from '@progress/kendo-react-tooltip';

import { CustomCalendar } from './customCalendar.jsx';

class App extends React.Component {
  tooltip = null;

  //we need to handle the blur event to ensure that mouseout causes tooltips to disappear
  handleBlur = (e) =&amp;gt; {
    this.tooltip.handleMouseOut({clientX: 0, clientY: 0})
  }

  render() {
    return (
      &amp;lt;div
        onMouseOver={event =&amp;gt; this.tooltip &amp;amp;&amp;amp; this.tooltip.handleMouseOver(event)}
        onMouseOut={event =&amp;gt; this.tooltip &amp;amp;&amp;amp; this.tooltip.handleMouseOut(event)}
      &amp;gt;
        &amp;lt;DatePicker
          onBlur={this.handleBlur}
          calendar={CustomCalendar}
        /&amp;gt;
        &amp;lt;Tooltip ref={(tooltip) =&amp;gt; this.tooltip = tooltip} anchorElement="target" position="top" openDelay={300} /&amp;gt;
      &amp;lt;/div&amp;gt;
    );
  }
}
ReactDOM.render(
  &amp;lt;App /&amp;gt;,
  document.querySelector('my-app')
);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without getting in to specific detail here, the extra code that we have around &lt;code&gt;onMouseOver&lt;/code&gt; and &lt;code&gt;onMouseOut&lt;/code&gt; is there to help in scenarios where a Tooltip may linger when interacting with the Calendar and covers scenarios where it may not disappear upon selecting the date.&lt;/p&gt;

&lt;p&gt;With a simple inclusion of the Tooltip and a couple of lines of code we now get the following view when highlighting a date in our custom date picker component.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fblogs%2F2019%2F2019-06%2F006-datepicker-custom-calendar-tooltips.png%3Fsfvrsn%3D19297b52_1" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fblogs%2F2019%2F2019-06%2F006-datepicker-custom-calendar-tooltips.png%3Fsfvrsn%3D19297b52_1" title="KendoReact DatePicker with Tooltips integrated with the custom calendar" alt="KendoReact DatePicker with Tooltips appearing when highlighting dates with the custom calendar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full project in action can be found right here.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is Just the Beginning
&lt;/h2&gt;

&lt;p&gt;As we highlighted in the beginning of the article, this is just a single part of the KendoReact DatePicker component that can be customized. We also stuck to the KendoReact family of UI components instead of adding in any other custom components or other 3rd party libraries, which is certainly possible. If you found the above deep-dive useful, or if you have a customization to a DatePicker somewhere in your application, feel free to comment and share your experiences in the comment section below!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.telerik.com/kendo-react-ui/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Ftb_branding_footer_670x178-tof.png%3Fsfvrsn%3De5c17f8c_1" title="TB\_BRANDING\_FOOTER\_670x178-ToF" alt="KendoReact UI Library for React"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>reactdatepicker</category>
      <category>kendoreact</category>
    </item>
    <item>
      <title>How to Use the KendoReact Editor</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Wed, 05 Jun 2019 15:48:47 +0000</pubDate>
      <link>https://dev.to/progresstelerik/how-to-use-the-kendoreact-editor-2900</link>
      <guid>https://dev.to/progresstelerik/how-to-use-the-kendoreact-editor-2900</guid>
      <description>&lt;p&gt;The editor is a powerful and versatile component of KendoReact, making it easy to add and format text and other HTML content. Learn how to use and customize it in your React apps.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.telerik.com/kendo-react-ui/components/editor/" rel="noopener noreferrer"&gt;Editor&lt;/a&gt; component in &lt;a href="https://www.telerik.com/kendo-react-ui" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt; is a full-featured, highly customizable WYSIWYG rich text editor that can be integrated wherever you need to provide HTML editing (CMS, forums, ticketing systems, mail clients, chat clients, etc). It enables users to input free-form text, apply a large spectrum of formatting options, and insert HTML content such as images, tables, and hyperlinks.&lt;/p&gt;

&lt;p&gt;The Editor offers a large set of built-in tools. You can also add custom tools, change the rendering of all the editor's elements (custom rendering) and extend the built-in functionality by adding plugins. The Editor, like all other components in the KendoReact UI library, is built in TypeScript.&lt;/p&gt;

&lt;p&gt;In this blog post, I will show you how to use the Editor, and we will go through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Getting Started with the KendoReact Editor&lt;/li&gt;
&lt;li&gt;How to Customize the React Text Editor's Built-In Tools&lt;/li&gt;
&lt;li&gt;How to Implement Custom Tools into the KendoReact Editor&lt;/li&gt;
&lt;li&gt;Why Sanitize Pasted Content?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started with the KendoReact Editor
&lt;/h2&gt;

&lt;p&gt;First, you need to import the &lt;code&gt;Editor&lt;/code&gt; component and &lt;a href="https://www.telerik.com/kendo-react-ui/components/editor/api/" rel="noopener noreferrer"&gt;&lt;u&gt;&lt;code&gt;EditorTools&lt;/code&gt;&lt;/u&gt;&lt;/a&gt; module from the package, &lt;a href="https://www.npmjs.com/package/@progress/kendo-react-editor" rel="noopener noreferrer"&gt;@progress/kendo-react-editor&lt;/a&gt;. Then, get the needed tools from &lt;code&gt;EditorTools&lt;/code&gt; and pass them into the &lt;code&gt;tools&lt;/code&gt; prop of the Editor. Setting initial content happens through the &lt;code&gt;defaultContent&lt;/code&gt; prop. Getting content from the &lt;code&gt;Editor&lt;/code&gt; or setting new content happens using the helper &lt;code&gt;getHtml()&lt;/code&gt; and &lt;code&gt;setHtml()&lt;/code&gt; functions exported by the &lt;code&gt;EditorUtils&lt;/code&gt; module.&lt;/p&gt;

&lt;p&gt;Up to this point, you don't need to know how the Editor manages its content or how the tools work. If your project requires customization or needs the Editor's functionality to be extended though, keep reading as we dive into the different ways you can customize or extend the functionality of the Editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Customize the React Text Editor's Built-In Tools
&lt;/h2&gt;

&lt;p&gt;There are two ways for customizing this editor's built-in tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using the Editor's utility functions for generating tools&lt;/li&gt;
&lt;li&gt;Wrapping the tool into a &lt;a href="https://reactjs.org/docs/higher-order-components.html" rel="noopener noreferrer"&gt;higher-order component&lt;/a&gt; (HOC) function, through which to add the new props you need&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Using the Editor's Utility Functions for Generating Tools
&lt;/h3&gt;

&lt;p&gt;All the Editor's tools are React components and are generated by a corresponding HOC function. Each tool also has a settings object which is being passed to its generation function as a parameter. The Editor package exports both the functions and the settings needed for tool generation. For example, the Bold tool has been created in the following way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { EditorToolsSettings, EditorTools } from '@progress/kendo-react-editor';
const BoldTool = EditorTools.createInlineFormatTool(EditorToolsSettings.bold);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Passing a modified version of &lt;code&gt;EditorToolsSettings.bold&lt;/code&gt; to &lt;code&gt;EditorTools.createInlineFormatTool()&lt;/code&gt; will create a custom tool. Here's how the default settings of the Bold tool look:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const boldSettings = {
  mark: 'strong', // toggle the 'STRONG' tag
  altMarks: ['b'], // recognize the 'B' tag also as Bold

  // recognize an inline node with font-weight style and a
  // value matching the regular expression
  altStyle: { name: 'font-weight', value: /^(bold(er)?|[5-9]\d{2,})$/ },

  // props which will be passed to the Button component of the tool
  props: {
    icon: 'bold',
    type: 'button'
  }
};

// The messages keys used by the tool for localization. See
// also https://www.telerik.com/kendo-react-ui/components/editor/globalization/#toc-messages

{
  messages: {
    title: 'editor.bold'
  },

  // the name of the command that the tool executes
  commandName: 'Bold'
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach allows you to easily modify the appearance and behavior of the tools without having to learn in-depth how the whole component is built. Follow this link for a full &lt;a href="https://www.telerik.com/kendo-react-ui/components/editor/tools/" rel="noopener noreferrer"&gt;list of settings and functions for Editor tool generation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrapping the Tool into a HOC
&lt;/h3&gt;

&lt;p&gt;The HOC will extend the props of the desired tool and return the custom tool. Then add the HOC function into your tools collection. Simple as that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const CustomBold = (props) =&amp;gt; {
  return (
    &amp;lt;Bold
      {...props}
      title="Custom Bold"
    /&amp;gt;
  );
};

&amp;lt;Editor
  tools={[
    [CustomBold, /* ... */]
  ]}
  &amp;lt;!-- ... --&amp;gt;
/&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Currently, the props of all tools extend the &lt;a href="https://www.telerik.com/kendo-react-ui/components/buttons/button/" rel="noopener noreferrer"&gt;KendoReact Button&lt;/a&gt; and &lt;a href="https://www.telerik.com/kendo-react-ui/components/dropdowns/dropdownlist/" rel="noopener noreferrer"&gt;DropDownList&lt;/a&gt; props. In our case, the props that are available for our custom tool are listed in the &lt;a href="https://www.telerik.com/kendo-react-ui/components/buttons/api/ButtonProps/" rel="noopener noreferrer"&gt;ButtonProps&lt;/a&gt; interface. In other words, when it comes to customizing the tools, you can also configure everything that the KendoReact Button or DropDownList allows.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Implement Custom Tools into the KendoReact Editor
&lt;/h2&gt;

&lt;p&gt;The above approach for customizing built-in tools can also be used for generating new tools. For example, if we take the Bold tool settings and change the &lt;code&gt;mark&lt;/code&gt; to &lt;code&gt;'code'&lt;/code&gt;, &lt;code&gt;props.icon&lt;/code&gt; to &lt;code&gt;'code-snippet'&lt;/code&gt;, and remove &lt;code&gt;altMarks&lt;/code&gt; and &lt;code&gt;altStyle&lt;/code&gt; fields, we can generate an entirely different tool that will toggle the &lt;code&gt;&amp;lt;code&amp;gt;&lt;/code&gt; element.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const codeSnippetSettings = {
  mark: 'code', // toggle the 'code' tag
  props: {
    icon: 'code-snippet',
    type: 'button'
  },
  messages: {},
  commandName: 'Code'
};

const CodeTool = EditorTools.createInlineFormatTool(codeSnippetSettings);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Editor's package also exports all the functionality that is used from the built-in tools, which includes functions for formatting, inserting content and others. This allows you to create your own tools for which the foundations have been already laid out (i.e. how to insert HTML content or apply formatting).&lt;/p&gt;

&lt;p&gt;Here is an example of our custom code tool and a few more tools for formatting and inserting content:&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Sanitize Pasted Content?
&lt;/h2&gt;

&lt;p&gt;Pasted HTML content could look quite ugly, especially if copied from MS Word. Lists are presented as styled paragraphs, and content could contain invalid HTML styles, comments and XML strings.&lt;/p&gt;

&lt;p&gt;In our experience, people are not always happy with the built-in paste functionality. They often have project-specific requirements, which need to be handled externally. For this reason, we have decided to move the format-stripping functionality outside of the Editor, so everyone can play with the code and edit it as needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Theming
&lt;/h3&gt;

&lt;p&gt;As with all KendoReact UI components for React, the Editor can also be styled in all three out-of-the-box themes: Bootstrap theme, Material, and our own Default theme. If you are working within your own design system/theme, you can easily customize the Editor's styling using CSS or create your own theme using the &lt;a href="https://themebuilder.telerik.com/kendo-react-ui" rel="noopener noreferrer"&gt;KendoReact ThemeBuilder&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the Hood
&lt;/h2&gt;

&lt;p&gt;For the Editor, we have decided to use an external engine instead of implementing our own from scratch. Since HTML editing has been here for a while, currently there are a lot of available engines to work with, and there is no value added in starting an Editor from scratch. After evaluating the available options, we decided that the &lt;a href="http://prosemirror.net/" rel="noopener noreferrer"&gt;ProseMirror&lt;/a&gt; toolkit is the right choice for our use case. It is very powerful and written in pure JavaScript.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.telerik.com/kendo-react-ui/components/editor/" rel="noopener noreferrer"&gt;Editor&lt;/a&gt; in KendoReact is a versatile WYSIWYG rich text editor whose functionality can be customized or extended to meet any project requirements. Built specifically for React, it is as fast and lightweight as the framework itself and can save you a lot of development time.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>kendoreact</category>
      <category>editor</category>
    </item>
    <item>
      <title>A Look Back at React Europe 2019 in Paris</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Wed, 29 May 2019 15:54:43 +0000</pubDate>
      <link>https://dev.to/progresstelerik/a-look-back-at-react-europe-2019-in-paris-194m</link>
      <guid>https://dev.to/progresstelerik/a-look-back-at-react-europe-2019-in-paris-194m</guid>
      <description>&lt;p&gt;React Europe 2019 concluded last week. I want to share my experience from the perspective of a first time visitor to Paris, and highlight some of the amazing talks, speakers and attendees that made this event so incredible for myself and my teammates from &lt;a href="https://www.telerik.com/kendo-react-ui" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For the 5th year in a row, React Europe has held a fantastic conference in Paris, France. My company (&lt;a href="https://www.progress.com/" rel="noopener noreferrer"&gt;Progress Software&lt;/a&gt;) had an amazing time not only as a &lt;a href="https://www.react-europe.org/#progress" rel="noopener noreferrer"&gt;sponsor&lt;/a&gt; of the main conference event, but we also participated in the hackathon on Saturday.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/crowd.png?sfvrsn=5e43d6aa_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fcrowd.png%3Fsfvrsn%3D5e43d6aa_1" title="The React Europe Crowd" alt="React Europe Crowd" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The event was held at the &lt;a href="http://www.espacecharenton.com/index.php?lang=en" rel="noopener noreferrer"&gt;Espace Charenton&lt;/a&gt; event center in the Porte de Charenton area of Paris and drew around one thousand React developers from all over the world.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/keynote.png?sfvrsn=7b7b05be_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fkeynote.png%3Fsfvrsn%3D7b7b05be_1" title="The Keynote by Jared Palmer" alt="Keynote by Jared palmer" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Host and emcee &lt;a href="https://twitter.com/jardpalmer" rel="noopener noreferrer"&gt;Jared Palmer&lt;/a&gt; led the conference with a really good message about embracing React, building new things, contributing to open source including ReactJS, writing understandable docs, welcoming newcomers to JavaScript and the community as a whole. If we don't give these people the room to grow and improve, they will find another community that does welcome them.&lt;/p&gt;

&lt;p&gt;React has always been a growing and welcoming community, and we have to work extra hard to make sure that doesn't change. I felt Jared's keynote to be an inspiring way to open the conference, which ended up being one of the more intimate of the conferences I had been to as all of the speakers were super approachable. It was a very friendly vibe amongst the attendees and I never once encountered anything to the contrary. The coordinators were not only welcoming to me and my team as a new sponsor, but they went out of their way to show us a good time. I recommend this as one of the few must-attend and must-sponsor events if your team is thinking about going next year.&lt;/p&gt;

&lt;p&gt;The food and catering throughout the event was top notch, french breakfasts and baguette sandwiches for lunch, and of course there is no shortage of amazing restaurants in Paris.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/amazing_food.png?sfvrsn=cf2958d0_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Famazing_food.png%3Fsfvrsn%3Dcf2958d0_1" title="The Amazing Food and French Catering" alt="Amazing Food and French Catering" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It doesn't hurt that React Europe is held in one of the most romantic and beautiful cities in the world. As a first time traveler (as was most of my group), we made some time to get around the city and take in the great landmarks and attractions. But the conference really was the shining light in this trip and I would like to quickly highlight some of my favorite talks and give you my experience as a first time attendee. &lt;/p&gt;

&lt;p&gt;We heard from many amazing speakers at this event. Some of them were veterans of react Europe, like &lt;a href="https://twitter.com/leeb" rel="noopener noreferrer"&gt;Lee Byron&lt;/a&gt;, who is the only speaker to have graced the React Europe stage every year since it began in 2015. Others included &lt;a href="https://twitter.com/mweststrate" rel="noopener noreferrer"&gt;Michael Westrate&lt;/a&gt;, &lt;a href="https://twitter.com/compuives" rel="noopener noreferrer"&gt;Ives van Hoorne&lt;/a&gt;, &lt;a href="https://twitter.com/notbrent" rel="noopener noreferrer"&gt;Brent Vatne&lt;/a&gt;, &lt;a href="https://twitter.com/joshwcomeau" rel="noopener noreferrer"&gt;Josh Comeau&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As an avid viewer of the previous years talks, I noticed a lot of new faces that may not have been on the main stage before or had only been involved with lightning talks in the past years. I thought many had extremely amazing talks, including: &lt;a href="https://twitter.com/kulkarniankita9" rel="noopener noreferrer"&gt;Ankita Kulkarni&lt;/a&gt;, &lt;a href="https://twitter.com/whereischarly" rel="noopener noreferrer"&gt;Charly POLY&lt;/a&gt;, &lt;a href="https://twitter.com/tyoushe" rel="noopener noreferrer"&gt;Olga Petrova&lt;/a&gt; &lt;a href="https://twitter.com/ellatrx" rel="noopener noreferrer"&gt;Ella van Durpe&lt;/a&gt;, and &lt;a href="https://twitter.com/alecdotbiz" rel="noopener noreferrer"&gt;Alec Larson&lt;/a&gt;, &lt;a href="https://twitter.com/Charles_Mangwa" rel="noopener noreferrer"&gt;Charles Mangwa&lt;/a&gt;, &lt;a href="https://twitter.com/lisa_gagarina" rel="noopener noreferrer"&gt;Lisa Gagarina&lt;/a&gt; and &lt;a href="https://twitter.com/timneutkens" rel="noopener noreferrer"&gt;Tim Neutkens&lt;/a&gt; just to name a few.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/hooks_in_motion.png?sfvrsn=94db476c_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fhooks_in_motion.png%3Fsfvrsn%3D94db476c_1" title="Hooks in Motion by Alec larson" alt="Hooks in Motion by Alec larson" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of my favorite talks as a UI developer who loves animations and React Hooks was from Alec Larson (@alecdotbiz), you can check out his full talk &lt;a href="https://www.youtube.com/watch?v=5QCYBiANRYs" rel="noopener noreferrer"&gt;"Hooks in Motion"&lt;/a&gt; about natural animations!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/move_fast.png?sfvrsn=c3867a1c_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fmove_fast.png%3Fsfvrsn%3Dc3867a1c_1" title="Move Fast With Confidence by Paul Armstrong" alt="Move Fast With Confidence by Paul Armstrong" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another great talk that really resonated with me, and which is valuable for everyone no matter their skill level, was Paul Armstrong's &lt;a href="https://www.youtube.com/watch?v=ikn_dBSski8" rel="noopener noreferrer"&gt;"Move Fast With Confidence"&lt;/a&gt; talk. You can preview this already on the &lt;a href="https://www.youtube.com/channel/UCorlLn2oZfgOJ-FUcF2eZ1A/videos" rel="noopener noreferrer"&gt;React Europe YouTube channel&lt;/a&gt;, and they are adding more and more talks every day from the conference, so you should go check them out now to see all of the amazing sessions that you might have missed or just want to watch again. I know I have been spending a lot of time in the past few days checking out the talks that I liked or maybe missed out on while I was there.&lt;/p&gt;

&lt;p&gt;It's important as a conference to not simply progress with more advanced talks each year, but to always have something for those who are new to React or even the industry for that matter. This keeps the roster of speakers each year fresh and keeps form alienating newcomers to the React space by making sure there is something for everyone.&lt;/p&gt;

&lt;p&gt;A few talks were what I feel to be a little on the advanced side (and this is OK), one example of which is &lt;a href="https://twitter.com/jverlaguet" rel="noopener noreferrer"&gt;Julien Verlaguet&lt;/a&gt;'s &lt;a href="https://www.youtube.com/watch?v=zXqrxQ5AL6I" rel="noopener noreferrer"&gt;talk&lt;/a&gt; on &lt;a href="http://www.skiplang.com" rel="noopener noreferrer"&gt;SKIP&lt;/a&gt;, the language recently open-sourced by Facebook. SKIP was a research project to explore language and runtime support for correct, efficient &lt;a href="https://stackoverflow.com/questions/6469437/what-is-the-difference-between-caching-and-memoization" rel="noopener noreferrer"&gt;memoization-based caching&lt;/a&gt; and &lt;a href="https://yihui.name/en/2018/06/cache-invalidation/" rel="noopener noreferrer"&gt;cache invalidation&lt;/a&gt;. Or I think he described it better when he said that it's a programming language built from the ground up with the ideas of React at its core, meaning that it deals with state in a similar way to React.  You will need to watch the talk as it is a very interesting presentation.&lt;/p&gt;

&lt;p&gt;I can't talk about everything that was presented on at the main stage, we would be here for hours, but it's all a great reason to go and check out day one and day two of the conference on YouTube, I'll put a list of all of the talks below so you can pick and choose and jump straight to the individual talks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Talks on YouTube
&lt;/h2&gt;

&lt;p&gt;Currently there are only a few talks posted to the React Europe YouTube page. The full day's video was posted after the conference but was removed yesterday as each individual talk began to be posted. Below are the talks that have been uploaded. I will try to keep the article updated as new ones are posted each day, but it's a time intensive process and it may take a while for all of them to get posted.&lt;/p&gt;

&lt;h3&gt;
  
  
  React Europe Conference Day One (May 23rd)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=u_0ZMiQZr0k" rel="noopener noreferrer"&gt;The State of React and its Future (Jared Palmer)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=viPhwbusWuE" rel="noopener noreferrer"&gt;Saving the Web, 16ms at a Time (Joshua Comeau)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=5QCYBiANRYs" rel="noopener noreferrer"&gt;React-spring: How Hooks Mark a Shift in How We Think of Animation (Alec Larson)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=viPhwbusWuE" rel="noopener noreferrer"&gt;Designing a Rich Content Editor for a Third of the Web (Ella van Durpe)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=VxJnNeHpUzc" rel="noopener noreferrer"&gt;A Hitchhiker’s Guide to the new ReasonReact (Nik Graf)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=K3JqNaw0-Us" rel="noopener noreferrer"&gt;Totally Native React With Revery (Bryan Phelps)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=ikn_dBSski8" rel="noopener noreferrer"&gt;Move fast With confidence (Paul Armstrong)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=zXqrxQ5AL6I" rel="noopener noreferrer"&gt;Skip (Julien Verlaguet)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Coders are the new Rock Stars (Daniel Stein/DJ Fresh) (Not Available Yet)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Uj7aWfrtey8" rel="noopener noreferrer"&gt;Magic Move transitions in React-native (Hein Rutjes)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Sq2M00vghqY" rel="noopener noreferrer"&gt;Data models all the way; GraphQL + mobx-state-tree (Michel Weststrate)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lightening Talks (Not Available Yet)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  React Europe Conference Day Two (May 24th)
&lt;/h3&gt;

&lt;p&gt;Links still being processed, update coming soon!&lt;/p&gt;

&lt;h2&gt;
  
  
  Hackathon
&lt;/h2&gt;

&lt;p&gt;This was held on the Saturday after the conference. We posed a &lt;a href="https://www.telerik.com/kendo-react-ui/" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt; challenge, offering attendees the opportunity to win an Apple Watch by hacking a demo we put together where attendees built a travel booking site using our React components.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/prizes.png?sfvrsn=4a645c98_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fprizes.png%3Fsfvrsn%3D4a645c98_1" title="Hackathon Prizes" alt="Hackathon Prizes" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This event was attended by about 20 developers that stuck around an extra day to try their hand at our coding challenges.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/hackerz.png?sfvrsn=a2cb2465_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fhackerz.png%3Fsfvrsn%3Da2cb2465_1" title="The Hackathon Attendees" alt="Hackathon Attendees" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everyone did such an amazing job that we decided to give three runners up KendoReact licenses as well!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/winner.png?sfvrsn=a9eecd78_1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fwinner.png%3Fsfvrsn%3Da9eecd78_1" title="The Hackathon Winner" alt="Hackathon Winner" width="772" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One winner (shown above), who combined both our KendoReact challenge and the AWS Amplify challenge, took home the well-deserved Apple Watch and a KendoReact license. As I said above three runners up also walked out with a KendoReact license. Thanks to everyone who participated!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>kendoreact</category>
    </item>
    <item>
      <title>Web Accessibility for Developers: What It Is and Why It’s Important (Part I)</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Wed, 08 May 2019 19:15:16 +0000</pubDate>
      <link>https://dev.to/progresstelerik/web-accessibility-for-developers-what-it-is-and-why-it-s-important-part-i-4279</link>
      <guid>https://dev.to/progresstelerik/web-accessibility-for-developers-what-it-is-and-why-it-s-important-part-i-4279</guid>
      <description>&lt;p&gt;Web accessibility is an increasingly important component of web development, for usability, compliance and many other reasons. In this series we'll explore the topic in depth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In the process of implementing &lt;a href="https://www.telerik.com/kendo-react-ui/components/accessibility/" rel="noopener noreferrer"&gt;accessibility compliance&lt;/a&gt; (Section 508, WCAG 2.0 and WAI-ARIA) for &lt;a href="https://www.telerik.com/kendo-react-ui" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt;, our suite of native UI components for React, we learned a lot on the topic. With this blog series, our goal is to introduce fellow engineers to web accessibility and share our practical knowledge and best practices.&lt;/p&gt;

&lt;p&gt;This first article is an attempt to answer what accessibility is and why it matters.&lt;/p&gt;

&lt;p&gt;The W3C definition is a great starting point: accessibility means that websites, tools, and technologies are designed and developed so that people with disabilities can use them. More specifically, people can: perceive, understand, navigate, and interact with the Web, and contribute to the Web.&lt;/p&gt;

&lt;p&gt;The perfect example for accessibility is if you can use your site without looking at it. Instead, you would listen to a screen reader that describes the UI and navigate with keyboard only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Accessibility is Generally Neglected
&lt;/h2&gt;

&lt;p&gt;While there are many reasons why accessibility is not omnipresent, as it ideally should be, three of them seem to be key. First, it’s hard to accommodate for something that you don’t understand well. Second, making your application accessible requires a lot of work – from understanding the premises of the standards you need to follow to designing the needed features and functionalities into your app (or finding a good way to modify it if it’s a legacy project). Then of course, there’s testing whether your approach has yielded the desired result – and much of the testing can only be done manually. The practices described in this series will make this effort easier, but we are still talking about a serious undertaking.&lt;/p&gt;

&lt;p&gt;Third is the economic argument which rightly or not dominates modern decision making: in most cases, a smaller percentage of your clients (or users) would be affected by a disability, which serves as justification to postpone implementing those accessibility improvements for the next release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Accessibility is Important
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ethics
&lt;/h3&gt;

&lt;p&gt;People with disabilities deal with a lot of challenges on a daily basis. If they are among your clients or users, enabling them to interact with your web app is plain human decency.&lt;/p&gt;

&lt;h3&gt;
  
  
  Market
&lt;/h3&gt;

&lt;p&gt;There's data that one billion people worldwide, and 20% of all internet users, have some form of disability. This is still a minority, but it comprises of a lot more people than most of us would think.&lt;/p&gt;

&lt;h3&gt;
  
  
  Legal
&lt;/h3&gt;

&lt;p&gt;As legislation in this domain develops, it becomes more and more likely for your business to be required by law to be accessible. The next section focuses on this topic.&lt;/p&gt;

&lt;h3&gt;
  
  
  User Experience
&lt;/h3&gt;

&lt;p&gt;Accessibility guidelines are designed to help people access and use your website more easily. As a side effect, most of them improve usability and directly benefit all users, including those without disabilities. For example, readable text helps not only people with poor sight, but all users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Engineering
&lt;/h3&gt;

&lt;p&gt;Many of the good practices for accessibility are good engineering and design principles in general. Often it is the poorly written code that is not accessible. For those of us who strive for mastery of our craft, accessibility is just a matter of doing a good job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reputation
&lt;/h3&gt;

&lt;p&gt;Having a more accessible site than your competition is a competitive advantage and can potentially create positive buzz around your brand.&lt;/p&gt;

&lt;h3&gt;
  
  
  SEO
&lt;/h3&gt;

&lt;p&gt;There is some overlap between good practices for SEO and web accessibility. For example, writing semantic HTML with proper use of descriptive attributes such as labels, video transcription, image captioning and using title and header tags all improve both a website’s SEO and its accessibility. &lt;/p&gt;

&lt;h2&gt;
  
  
  Legislation
&lt;/h2&gt;

&lt;p&gt;Current legislation is moving in a direction where accessibility is becoming a mandatory feature of the web. In the USA, accessibility is covered by the Americans with Disabilities Act (&lt;a href="https://www.ada.gov/" rel="noopener noreferrer"&gt;ADA&lt;/a&gt;). Many of the developed countries have similar laws, for example, the UK has the &lt;a href="http://www.legislation.gov.uk/ukpga/2010/15/contents" rel="noopener noreferrer"&gt;Equality Act of 2010&lt;/a&gt;. In practical terms, these laws mean that public sector organizations and businesses are required by law to follow the &lt;a href="https://www.w3.org/WAI/standards-guidelines/wcag/" rel="noopener noreferrer"&gt;Web Content Accessibility Guidelines (WCAG)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s not just your customers and users you should be thinking about. If your organization has 50 or more employees, you need to accommodate those that have disabilities. This means your internal web tools will have to be accessible as well.&lt;/p&gt;

&lt;p&gt;If you are a contractor working for the government, you need to comply with &lt;a href="https://www.section508.gov/" rel="noopener noreferrer"&gt;Section 508 of the Rehabilitation Act&lt;/a&gt; in your work in addition to the above. By law, all US government services need to follow Section 508.&lt;/p&gt;

&lt;p&gt;These laws are not just an indication of good intentions. More and more law firms take legal actions based on accessibility legislation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We hope you are convinced that accessibility matters and is a worthwhile project to pursue. Now that we’ve laid the foundations, in the following parts, we will explore how to achieve good results meeting accessibility requirements with a reasonable investment of effort.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Whole Series: What's to Come
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Part 2: Types of Disabilities and Best Practices to Accommodate for Them. Here we further define the problem, break it down into sections on different disability types, suggesting individual solutions.&lt;/li&gt;
&lt;li&gt;Part 3: Technical Best Practices. This part is technically oriented and focuses on working with screen readers.&lt;/li&gt;
&lt;li&gt;Part 4: More Best Practices and Resources. Here we go over more practices about organizing our workflow and further explore how to make this daunting task manageable.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>Discovering React Hooks with KendoReact</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Wed, 01 May 2019 18:52:04 +0000</pubDate>
      <link>https://dev.to/progresstelerik/discovering-react-hooks-with-kendoreact-3bjd</link>
      <guid>https://dev.to/progresstelerik/discovering-react-hooks-with-kendoreact-3bjd</guid>
      <description>&lt;p&gt;React Hooks have been available for use since the React 16.8 release. We'll learn how we can start applying these Hooks by using our KendoReact components.&lt;/p&gt;

&lt;p&gt;With the release of Hooks, building applications in React and managing the local state of its components is now easier, more straightforward and concise. There is a lot to know about Hooks from a conceptual standpoint, and we have many articles here on the Progress Telerik blog to help you get acquainted with them - I've highlighted a few of them below. In this post, we'll learn about Hooks and how to apply them using &lt;a href="https://www.telerik.com/kendo-react-ui" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt; components.&lt;/p&gt;

&lt;p&gt;Building React applications has not always been a breeze - before Hooks there was a lot you had to know about several patterns and practices in React just to do everyday things like state management, separating logic within your components, ensuring that you could share lifecycle methods and such across components, etc. It required understanding about several different techniques like Mixins, Higher Order Components, and or Render Props, something typically only done with classes.&lt;/p&gt;

&lt;p&gt;Before Hooks React developers, when faced with ever growing state concerns, would reach for Redux or MobX to manage their data and communication state. This was a natural use for Redux, but there are other forms of application state that using Redux might not be as good of a choice for, like the state inside of class-based components that would use &lt;code&gt;this.state&lt;/code&gt; and &lt;code&gt;setState&lt;/code&gt;. &lt;code&gt;setState&lt;/code&gt; is a method provided in React allowing the user to define and change state over time. This capability used to only be available in class components, until Hooks.&lt;/p&gt;

&lt;p&gt;Below are some articles on our blog explaining Hooks in more detail:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/progresstelerik/hello-create-react-app-20-316-temp-slug-3014493"&gt;Say Hello to Create React App (2/3)&lt;/a&gt; to help get started in React&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/progresstelerik/how-to-use-basic-react-hooks-for-state-and-effects-4bld"&gt;Learn Basic React Hooks State and Effects&lt;/a&gt; for local state and effects&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/progresstelerik/how-to-use-basic-react-hooks-for-context-45pp-temp-slug-9116858"&gt;Learn Basic React Hooks for Context&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/progresstelerik/how-to-use-basic-react-hooks-for-reducers-4nfo-temp-slug-1109404"&gt;Learn Basic React Hooks for Reducers&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/progresstelerik/everything-you-need-to-create-a-custom-react-hook-47kl"&gt;Learn to Create Custom React Hooks&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://reactjs.org/docs/hooks-intro.html" rel="noopener noreferrer"&gt;ReactJS.org documentation on Hooks&lt;/a&gt; is also a great resource that you should know about.&lt;/p&gt;

&lt;p&gt;As I stated before, Hooks are great for dealing with certain types of application state. A few examples are control state, local component state and session state. I'd like to leverage Hooks when working with our KendoReact components, but I want to start simple. Let's refactor one of the StackBlitz demos from a demo that uses classes and switch it to using functional components instead.&lt;/p&gt;

&lt;p&gt;We will look for instances where the demo is using &lt;code&gt;this.state&lt;/code&gt; and &lt;code&gt;this.setState&lt;/code&gt;, because when we convert the component to functional we will not have to use the &lt;code&gt;this&lt;/code&gt; keyword anymore, and we will not need to use a constructor or call &lt;code&gt;setState&lt;/code&gt;. When we work with Hooks, we do things slightly differently. So let's get into refactoring the KendoReact demo that shows how to work with our &lt;a href="https://www.telerik.com/kendo-react-ui/components/dialogs/dialog" rel="noopener noreferrer"&gt;KendoReact Dialog&lt;/a&gt;. I have &lt;a href="https://stackblitz.com/edit/kendoreact-dialog-class-based?file=app/main.jsx" rel="noopener noreferrer"&gt;forked the original StackBlitz demo&lt;/a&gt; from the Dialog Overview page, that will be our starting point.&lt;/p&gt;

&lt;p&gt;If you look at this demo's &lt;code&gt;main.jsx&lt;/code&gt; page which I have shown below, there are several target areas we can identify that will change when using a functional component and React Hooks. The code and lines highlighted in GREEN will need modification, and the lines highlighted in RED will be able to be removed completely.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2019/2019-05/refactor_highlights.png?sfvrsn=8f624148_0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fblogs%2F2019%2F2019-05%2Frefactor_highlights.png%3Fsfvrsn%3D8f624148_0" title="refactor\_highlights" alt="refactor_highlights" width="860" height="670"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On line 6 we have a &lt;code&gt;class&lt;/code&gt; definition, we need to convert this to a functional component.&lt;/li&gt;
&lt;li&gt;On line 7 we have a constructor, on line 8 a call to &lt;code&gt;super()&lt;/code&gt; and on line 10 we have some binding. None of these are needed in our functional component using Hooks.&lt;/li&gt;
&lt;li&gt;On line 9 we create an instance of our state and give it a default value of &lt;code&gt;true&lt;/code&gt; this will instead be a call to the &lt;code&gt;useState&lt;/code&gt; hook.&lt;/li&gt;
&lt;li&gt;On line 13 we need to rename the &lt;code&gt;toggleDialog&lt;/code&gt; function and switch it to the ES6 Arrow Function style syntax, lines 14 through 16 will simply call an update method provided by our &lt;code&gt;useState()&lt;/code&gt; assignment called &lt;code&gt;setVisible&lt;/code&gt; and the value it will be referencing will be &lt;code&gt;visible&lt;/code&gt; instead of &lt;code&gt;this.state.visible&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;On line 19 we have a call to &lt;code&gt;render()&lt;/code&gt; which will not be necessary in our functional component&lt;/li&gt;
&lt;li&gt;On line 22, 23, 26 and 27 we have references to &lt;code&gt;this.&lt;/code&gt; and &lt;code&gt;this.state&lt;/code&gt; that will need to be to reference &lt;code&gt;visible&lt;/code&gt; and &lt;code&gt;toggleVisible&lt;/code&gt; instead of &lt;code&gt;toggleDialog&lt;/code&gt; and I will explain later on why I want to rename that function.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's get started. The first thing we need to do is to convert the class to a functional component, remove the constructor and call to &lt;code&gt;super()&lt;/code&gt;, the binding of the &lt;code&gt;toggleDialog()&lt;/code&gt; function. There are multiple syntax options we could use here - I prefer the ES6 Arrow Function style:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const multiply = (x, y) =&amp;gt; { return x * y };  

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In our component line 5 would now look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const DialogWrapper = () =&amp;gt; {

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's go ahead and set up our hook that will take the place of the state object. Instead of creating an object named state, we will set up a call to &lt;code&gt;useState()&lt;/code&gt; and destructure its return value into a variable that will hold our state and an update/set method to update that piece of state. Our name of our state will be &lt;code&gt;visible&lt;/code&gt; and its update method will be called &lt;code&gt;setVisible&lt;/code&gt;. We will basically remove the entire constructor and replace it with this one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const [visible, setVisible] = useState(true);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since we are using the &lt;code&gt;useState()&lt;/code&gt; basic hook, we also need to import it. Our React import will now look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState } from 'react';

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we need a function inside this component that will deal with calling &lt;code&gt;setVisible&lt;/code&gt; for the purposes of toggling its value. We decided that we would name it &lt;code&gt;toggleVisible&lt;/code&gt; instead of &lt;code&gt;toggleDialog&lt;/code&gt; and since we are in a functional component, the syntax that was used before will not work. For this reason, I will update it to the ES6 Arrow Function style.&lt;/p&gt;

&lt;p&gt;This function will simply set the &lt;code&gt;visible&lt;/code&gt; state to the opposite of its current state at the time. Behind the scenes React is managing this &lt;code&gt;visible&lt;/code&gt; variable in a similar way as it would if you were calling &lt;code&gt;setState&lt;/code&gt; in a class component. That management is just being abstracted by something behind the scenes called &lt;code&gt;useReducer&lt;/code&gt; but we are not going to get into exactly how all of that works in this simple example. Our new code looks like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const DialogWrapper = () =&amp;gt; {;
  const [visible, setVisible] = useState(true);
  const toggleVisible = () =&amp;gt; setVisible(!visible);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we need to get rid of the &lt;code&gt;render()&lt;/code&gt; block and its two curly braces. Also, we need to remove all references to this &lt;code&gt;this.toggleDialog&lt;/code&gt; and &lt;code&gt;this.state.visible&lt;/code&gt; and change them to &lt;code&gt;toggleVisible&lt;/code&gt; and &lt;code&gt;visible&lt;/code&gt; accordingly. Now inside of our &lt;code&gt;return()&lt;/code&gt; we will have the following changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return (
  &amp;lt;div&amp;gt;
  &amp;lt;Button className="k-button" onClick={toggleVisible}&amp;gt;Open Dialog&amp;lt;/Button&amp;gt;
  {visible &amp;amp;&amp;amp; &amp;lt;Dialog title={"Please confirm"} onClose={toggleVisible}&amp;gt;
    &amp;lt;p style={{ margin: "25px", textAlign: "center" }}&amp;gt;Are you sure you want to continue?&amp;lt;/p&amp;gt;
    &amp;lt;DialogActionsBar&amp;gt;
    &amp;lt;Button className="k-button" onClick={toggleVisible}&amp;gt;No&amp;lt;/Button&amp;gt;
    &amp;lt;Button className="k-button" onClick={toggleVisible}&amp;gt;Yes&amp;lt;/Button&amp;gt;
    &amp;lt;/DialogActionsBar&amp;gt;
  &amp;lt;/Dialog&amp;gt;}
  &amp;lt;/div&amp;gt;
);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again we have just updated our code in the &lt;code&gt;return()&lt;/code&gt; to not reference the &lt;code&gt;this&lt;/code&gt; keyword and to use our new function name &lt;code&gt;toggleVisible&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;These are all the changes that need to be made. We have successfully converted our KendoReact demo to use a functional component and the basic &lt;code&gt;useState&lt;/code&gt; hook. Let's take a look at what our overall changes looked like using and awesome tool called GitHistory:&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%2Fo7hpr3a3phmslznbs2it.gif" 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%2Fo7hpr3a3phmslznbs2it.gif" width="1024" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What I have done here is downloaded the original StackBlitz class based demo into its own Git repo. The class-based version would be the initial commit and then I made a second commit after refactoring to the functional hook style that we made. GitHistory gives me the ability to scrub through those commits and see in an animated way how our &lt;code&gt;main.jsx&lt;/code&gt; file has changed over those two commits. I think it's a powerful visual for someone learning how to use Hooks and seeing the change from the old class-based approach to the function based approach.&lt;/p&gt;

&lt;p&gt;I have also pushed &lt;a href="https://github.com/httpJunkie/kendoreact-dialog-to-hooks-demo" rel="noopener noreferrer"&gt;this repo to my GitHub&lt;/a&gt; account where you can &lt;a href="https://github.githistory.xyz/httpJunkie/kendoreact-dialog-to-hooks-demo/blob/master/src/app/main.jsx" rel="noopener noreferrer"&gt;view it with GitHistory&lt;/a&gt; on your own. &lt;a href="https://dev.to/scottw/-git-history-5fpc-temp-slug-9335267"&gt;GitHistory&lt;/a&gt; (created by &lt;a href="https://github.com/pomber" rel="noopener noreferrer"&gt;Rodrigo Pombo&lt;/a&gt;) is a very cool plugin that allows you to diff any file in your repo and scrub through the commits and see how over time the file has changed in a very visual way.&lt;/p&gt;

&lt;p&gt;This is a great place to stop. We learned what it takes to convert a class component with a simple state object into a functional component using a hook. In the next part of this blog series, we will take a deeper dive into setting up several &lt;a href="https://www.telerik.com/kendo-react-ui" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt; components which have more basic Hooks, plus some advanced Hooks like &lt;code&gt;useReducer&lt;/code&gt;, and take our Hooks skills a little further.&lt;/p&gt;

</description>
      <category>react</category>
      <category>reacthooks</category>
      <category>kendoreact</category>
    </item>
    <item>
      <title>Dealing with CORS in Create React App</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Thu, 25 Apr 2019 18:05:11 +0000</pubDate>
      <link>https://dev.to/progresstelerik/dealing-with-cors-in-create-react-app-39jf</link>
      <guid>https://dev.to/progresstelerik/dealing-with-cors-in-create-react-app-39jf</guid>
      <description>&lt;p&gt;If you've ever built a web app that had to request data from a different domain, you've probably had to wrap your head around the browser's &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy" rel="noopener noreferrer"&gt;same-origin policy&lt;/a&gt; and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" rel="noopener noreferrer"&gt;CORS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this article we'll learn how to get around CORS issues using &lt;a href="https://facebook.github.io/create-react-app/" rel="noopener noreferrer"&gt;Create React App&lt;/a&gt;'s proxying capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;If our app is hosted under a certain domain (e.g. &lt;code&gt;domain1.com&lt;/code&gt;), and it tries to make a request to an API that lives under a different domain (e.g. &lt;code&gt;domain2.com&lt;/code&gt;), then the browser's same-origin policy kicks in and blocks the request.&lt;/p&gt;

&lt;p&gt;CORS is a feature that allows &lt;code&gt;domain2.com&lt;/code&gt; to tell the browser that it's cool for &lt;code&gt;domain1.com&lt;/code&gt; to make requests to it, by sending certain HTTP headers.&lt;/p&gt;

&lt;p&gt;However, CORS can be tricky to get right, so sometimes people avoid it altogether by serving their frontend and backend under the same domain in production.&lt;/p&gt;

&lt;p&gt;Create React App allows us to replicate this setup in development, so that we don't have to deal with CORS there either. It provides two options to do so: one that's very straightforward but is not very flexible, and one that requires a bit more work but is very flexible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automatic Proxying
&lt;/h2&gt;

&lt;p&gt;We can tell Create React App to intercept requests to unknown routes and send them to a different domain, using the &lt;code&gt;proxy&lt;/code&gt; option in &lt;code&gt;package.json&lt;/code&gt;. It looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "flickr-client",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^16.8.6",
    "react-dom": "^16.8.6",
    "react-scripts": "^2.1.8"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "proxy": "http://localhost:4000"
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we start our app, it will be served under &lt;code&gt;http://localhost:3000&lt;/code&gt;. If we request the root path &lt;code&gt;/&lt;/code&gt;, then Create React App will respond with the corresponding HTML for our app. But if we were to request a different path like &lt;code&gt;/api&lt;/code&gt;, Create React App would transparently forward it to &lt;code&gt;http://localhost:4000/api&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If we look at the network requests in your browser dev tools, we'll see that the request was made to &lt;code&gt;http://localhost:3000/api&lt;/code&gt;, but it was in fact served by &lt;code&gt;http://localhost:4000/api&lt;/code&gt; without the browser knowing.&lt;/p&gt;

&lt;p&gt;It can't get easier than this!&lt;/p&gt;

&lt;h3&gt;
  
  
  Manual Proxying
&lt;/h3&gt;

&lt;p&gt;If we need more control over how these cross-domain requests get made, we have another option, which is to create a file &lt;code&gt;src/setupProxy.js&lt;/code&gt; that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module.exports = function(app) {
  // ...
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That function receives &lt;code&gt;app&lt;/code&gt;, an instance of an &lt;a href="https://expressjs.com/" rel="noopener noreferrer"&gt;Express&lt;/a&gt; app, so we can do whatever we want with it.&lt;/p&gt;

&lt;p&gt;For example, we can use a middleware like &lt;a href="https://github.com/chimurai/http-proxy-middleware" rel="noopener noreferrer"&gt;&lt;code&gt;http-proxy-middleware&lt;/code&gt;&lt;/a&gt; to proxy requests just like we did with the &lt;code&gt;proxy&lt;/code&gt; option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const proxy = require("http-proxy-middleware");

module.exports = app =&amp;gt; {
  app.use(
    "/api",
    proxy({
      target: "http://localhost:4000",
      changeOrigin: true
    })
  );
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But we can go further, and use &lt;code&gt;http-proxy-middleware&lt;/code&gt;'s options like &lt;code&gt;pathRewrite&lt;/code&gt; to change the path of the request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const proxy = require("http-proxy-middleware");

module.exports = app =&amp;gt; {
  app.use(
    "/api",
    proxy({
      target: "http://localhost:4000",
      changeOrigin: true,
      pathRewrite: {
        "^/api": "/api/v1"
      }
    })
  );
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this configuration, a request made to &lt;code&gt;http://localhost:3000/api/foo&lt;/code&gt; will be forwarded to &lt;code&gt;http://localhost:4000/api/v1/foo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We could also add a logger like &lt;a href="https://github.com/expressjs/morgan" rel="noopener noreferrer"&gt;&lt;code&gt;morgan&lt;/code&gt;&lt;/a&gt; while we're at it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const proxy = require("http-proxy-middleware");
const morgan = require("morgan");

module.exports = app =&amp;gt; {
  app.use(
    "/api",
    proxy({
      target: "http://localhost:4000",
      changeOrigin: true,
      pathRewrite: {
        "^/api": "/api/v1"
      }
    })
  );

  app.use(morgan('combined'));
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So now every time a request gets made to our proxy, it will get logged to the console.&lt;/p&gt;

&lt;p&gt;The possibilities are truly endless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;If your web app needs to request data from a different domain, and you want your development environment to mimic a production configuration where frontend and backend are served from the same domain, make sure to take a look at the &lt;code&gt;proxy&lt;/code&gt; and &lt;code&gt;src/setupProxy.js&lt;/code&gt; options of Create React App. They'll make development of your app much easier!&lt;/p&gt;

&lt;h3&gt;
  
  
  Further Reading
&lt;/h3&gt;

&lt;p&gt;Looking to learn more about developing apps for React with Create React App? Check out the posts below, and don't forget to visit our &lt;a href="https://www.telerik.com/blogs/all-things-react" rel="noopener noreferrer"&gt;All Things React post&lt;/a&gt; for a wide range of info and pointers on everything React.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/progresstelerik/hello-create-react-app-20-316-temp-slug-3014493"&gt;Hello, Create React App 2.0!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/progresstelerik/5-things-i-didnt-know-about-create-react-app-49nj"&gt;5 Things I Didn't Know about Create React App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/progresstelerik/10-more-things-you-didnt-know-about-create-react-app-3dj8"&gt;10 More Things You Didn’t Know About Create React App&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>createreactapp</category>
      <category>cors</category>
    </item>
    <item>
      <title>A Look Back at React Amsterdam 2019</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Thu, 18 Apr 2019 20:26:47 +0000</pubDate>
      <link>https://dev.to/progresstelerik/a-look-back-at-react-amsterdam-2019-4bf5</link>
      <guid>https://dev.to/progresstelerik/a-look-back-at-react-amsterdam-2019-4bf5</guid>
      <description>&lt;p&gt;React Amsterdam took place last week in Amsterdam Noord at &lt;a href="https://kromhouthal.com/en/" rel="noopener noreferrer"&gt;De Kromhouthal&lt;/a&gt; organized by &lt;a href="https://gitnation.org/" rel="noopener noreferrer"&gt;GitNation&lt;/a&gt; an amazing group of folks who do an amazing job at running developer conferences like &lt;a href="https://jsnation.com/" rel="noopener noreferrer"&gt;JS Nation&lt;/a&gt; another Netherlands based JS community project and now conference, &lt;a href="https://reactday.berlin/" rel="noopener noreferrer"&gt;React Day Berlin&lt;/a&gt; a first of its kind, a full day conference in Berlin Germany, and others. This year's React Amsterdam conference was attended by more than 1500 React developers. I attended the conference, volunteered for both days of workshops and ran a booth for my company &lt;a href="https://www.progress.com/" rel="noopener noreferrer"&gt;Progress&lt;/a&gt; to show off our suite of &lt;a href="https://www.telerik.com/kendo-react-ui/" rel="noopener noreferrer"&gt;KendoReact&lt;/a&gt; UI components.&lt;/p&gt;

&lt;h2&gt;
  
  
  An Amazing Conference Location
&lt;/h2&gt;

&lt;p&gt;The Kromhouthal used to be a major marine engine manufacturing plant. I showed up the day before and got to see the hall before most of the conference setup was complete. Alone it's a cold dark hall, a scene that in the past would have been a labor intense atmosphere with massive machines, today it's used for major events and can hold thousands of people with its long hall and massively tall ceilings. The venue was easily accessible using the ferry from Central Station to the IJplein terminal but I also could have come from the Noordpark Metro station and in either situation just had a short 5 minute walk to the venue through a bustling creative area having a mix of local resident housing and soon to be a hotel and packing district. This area will continue to be a great location especially with plans to extend a bridge from the city center over the IJ (river). Check out these well-produced videos from the organizers to get an &lt;a href="https://www.youtube.com/watch?time_continue=15&amp;amp;v=NQyL-Dm7Kig" rel="noopener noreferrer"&gt;idea of the venue&lt;/a&gt;, &lt;a href="https://www.youtube.com/watch?v=bLgrUrPJdKE" rel="noopener noreferrer"&gt;atmosphere and moods&lt;/a&gt; from React Amsterdam past events.&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazing Workshops Teaching Valuable Principles and Patterns
&lt;/h2&gt;

&lt;p&gt;Although not at the infamous Kromhouthal, part of React Amsterdam (the workshops) took place nearby, in the shadow of A'DAM Lookout at the &lt;a href="https://tolhuistuin.nl/" rel="noopener noreferrer"&gt;Tolhuistuin&lt;/a&gt; a restaurant also fronting the IJ with amazing views for the workshop attendees. This is where I volunteered for two days and had a great opportunity to work with the workshop instructors and attendees. I love helping out wherever I can, I figure that if I'm in Amsterdam for the conference, I can only do so much sightseeing, I like to work in the city to a certain capacity, feel what it's like to be there with deadlines, requirements and work to get done. There are many others like this and I met a lot of them, I worked with a few amazing volunteers and organizers like Olena, Daria, Sara, Ravi, Nicholas, Maksym, and Aleksandra directly and others that had given up their time in this amazing city to serve the community and I want to thank them for being so awesome. You may not know these people but I want you to know that the success of this conference is greatly affected by their hard work.&lt;/p&gt;

&lt;p&gt;Speakers like Kent C Dodds did two workshops (&lt;a href="https://react.amsterdam/workshops#advanced" rel="noopener noreferrer"&gt;Advanced React&lt;/a&gt; &amp;amp; &lt;a href="https://react.amsterdam/workshops#testing" rel="noopener noreferrer"&gt;Testing React&lt;/a&gt;), one each day and he also spoke at the conference. His workshops were exactly the kind I would have gotten so much value attending, I was able to be a fly on the wall, but I hear that you can visit his sites and get some of this same training. There were also speakers like Andrey Okonetchnikov &amp;amp; Artem Sapegin who gave an amazing workshop on &lt;a href="https://react.amsterdam/workshops#design-systems" rel="noopener noreferrer"&gt;Design Systems for React Developers&lt;/a&gt; showing how to design systems offer a systematic approach to the process of product creation. Their view of the IJ was amazing, which in my horrible pictures you can't see.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/workshopimage_lg.jpg?sfvrsn=6c8959a6_0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fworkshopimage_lg.jpg%3Fsfvrsn%3D6c8959a6_0" title="React Amsterdam workshop overlooking the river" alt="React Amsterdam workshop" width="1024" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Maybe I got one of the river, ... Here we go!  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/riverimage_sm.jpg?sfvrsn=8289b9b1_0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Friverimage_sm.jpg%3Fsfvrsn%3D8289b9b1_0" title="React Amsterdam workshop river view" alt="React Amsterdam workshop river view" width="760" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this same venue, we had Michel Weststrate's &lt;a href="https://react.amsterdam/workshops#typescript" rel="noopener noreferrer"&gt;TypeScript for React Devs&lt;/a&gt; and React Native Workshop by Alex Lobera &amp;amp; Horacio Herrera, all of these workshops in three different rooms at the &lt;a href="https://tolhuistuin.nl/" rel="noopener noreferrer"&gt;Tolhuistuin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Across the river closer to the Amsterdam City Center, there was another set of workshops that I'm sure provides as unique of a location as the one I was volunteering at. It was at the &lt;a href="https://www.igc.nl/" rel="noopener noreferrer"&gt;Royal Industrieele Groote Club&lt;/a&gt; which I walked past several times admiring and not knowing it was actually where the other workshops had taken place. Such a beautiful building like so many others in Amsterdam the City. At that location there were talks from Kitze on two different days (&lt;a href="https://react.amsterdam/workshops#graphql" rel="noopener noreferrer"&gt;GraphQL Workshop&lt;/a&gt; &amp;amp; &lt;a href="https://react.amsterdam/workshops#advanced-with-kitze" rel="noopener noreferrer"&gt;Advanced React&lt;/a&gt;). They also had another interesting fundamentals workshop on [Max Stoiber &lt;a href="https://react.amsterdam/workshops#modern-react" rel="noopener noreferrer"&gt;Modern React&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I could not be in two places at once, but I am very interested in the differences between Kitze' and Kent's workshops. Would love if these workshops were recorded adn given access later on like the talks are done. I know that it would have gaps where the class is working, but the instructors could get clever during this time and maybe live code the exercise on the broadcast. I don't know many ways to make this conference experience more immersive, but this sounds like something they should explore. maybe they already are!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conference Kickoff
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/registration_lgc79582d2115342ce8d85e5a861310f0d.jpg?sfvrsn=57470d99_0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fregistration_lgc79582d2115342ce8d85e5a861310f0d.jpg%3Fsfvrsn%3D57470d99_0" title="React Amsterdam Registration" alt="React Amsterdam Registration" width="1024" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Helping at the registration was so much fun getting to meet everyone even if it was just for a minute to get them a badge and some swag. As an attendee, I got to walk away with a bag and I love my new coffee mug! There were a lot of people to process and I felt we did a good job of getting those people who showed up at the beginning, into the event on time for the kickoff, although hectic with 1500 people coming through the doors over a few hour period. It felt like a success and the conference got underway. I headed to my booth to check in with my tam where I switched hats one last time at React Amsterdam. Working our booth and meeting people that were interested in installing &lt;a href="https://www.telerik.com/kendo-react-ui/components/" rel="noopener noreferrer"&gt;our components&lt;/a&gt; and playing with KendoReact. I love talking about the library and getting others excited about it.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://d585tldpucybw.cloudfront.net/sfimages/default-source/default-album/booth_lg.jpg?sfvrsn=fcb88bed_0" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fbooth_lg.jpg%3Fsfvrsn%3Dfcb88bed_0" title="KendoReact Booth" alt="KendoReact Booth" width="1024" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conference Talk Highlights
&lt;/h2&gt;

&lt;p&gt;There were so many great presentations and Lightening talks, I want to take some time to highlight what I think were the most valuable ones that I attended. Being someone who works with a lot of UI, layout, and presentation in React, I am a big proponent of the fundamentals and general knowledge. I start to get lost when it comes to the advanced and deep dive topics outside of UI and basic React, and what's great about this conference is that they have something for everybody. Let's look at some of those talks and review them here:&lt;/p&gt;

&lt;h3&gt;
  
  
  Requisite React (Kent C Dodds)
&lt;/h3&gt;

&lt;p&gt;The conference started off strong with &lt;a href="https://www.telerik.com/feeds/kentcdodds.com/about/" rel="noopener noreferrer"&gt;Kent C Dodds&lt;/a&gt; on the main stage with a talk called &lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=1405s/" rel="noopener noreferrer"&gt;"Requisite React"&lt;/a&gt;. In his own words, this talk is about: "Taking a few steps back and thinking about the usefulness of the fundamentals". We learn how to fix a droopy faucet head (with pics), and learn how understanding abstractions help us to be more effective when using them, not only in real life ?? but also in our code. This means being mindful of our abstractions and understanding that each one ultimately has some type of cost. My favorite abstraction that he dives into is that of JSX and I won't ruin the talk, but getting a look at how we can easily convert our Babel into raw JS, we are able to see under the hood and understand this abstraction better. I felt a lot of the talk was mostly about how to level up as a React developer and if you were a boss or manager who sent several of your developers out to &lt;a href="https://react.amsterdam/" rel="noopener noreferrer"&gt;React Amsterdam&lt;/a&gt;, this is exactly the type of information you want out of the gate!&lt;/p&gt;

&lt;h3&gt;
  
  
  Refactoring React (Siddarth Kshetrapal)
&lt;/h3&gt;

&lt;p&gt;No time is wasted getting into another very valuable fundamentals based talk around &lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=3268s" rel="noopener noreferrer"&gt;refactoring in React&lt;/a&gt;, again we are definitely getting our value right out of the gate with many helpful tips this time from &lt;a href="https://github.com/siddharthkp/" rel="noopener noreferrer"&gt;Siddarth Kshetrapel&lt;/a&gt; an independent developer from India who does an amazing job refactoring a login and authentication form. Starting with class components and constructors with a fair amount of prop drilling involved, we refactor this code quickly into something more manageable and future proof. Some of the techniques that he talks about are spreading props, using methods passed down in props the proper way and how to ensure that we are not overriding prop values for methods or applying them due to not managing our props correctly. He touches on principles like "Single Responsibility" and "Separation of Concerns". I really like most the parts where he talks about understanding about mixing of controlled vs uncontrolled state and how to avoid this. Pick one, he likes uncontrolled components, and this gives us the chance to get into higher order components or better yet, React Hooks. &lt;code&gt;useSmartness()&lt;/code&gt; FTW!&lt;/p&gt;

&lt;p&gt;So those talks were very code heavy and I was already in the mood for some straight up slide talk! My favorite kind fo talks! I don't have to strain my eyes and I still learn some new stuff I didn't know before.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Common Design Language (Andrey Okonetchnikov)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/okonet" rel="noopener noreferrer"&gt;Andrey&lt;/a&gt; who also did an amazing workshop on the same topic of Design Systems in React, puts all the pertinent info into a very clean and easy to understand talk on building a common design language and reducing the choices of options between typography, spacing and color to create a design language system. Using a common design language systems allows for reusability of design choices across multiple products and logos. This can be something as simple as he points out as the design of the German government logos vs Austrian government logos. One has a clear design system and language the other although creative lacks distinguishable characteristics that would show a clear alignment of all of its properties through a common design language.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=6900s" rel="noopener noreferrer"&gt;Andrey's presentation&lt;/a&gt; had many strong visuals like above that helped to show us how a design system language can help not only your developers and designers talk, but also help your organization speak to its clients and customers clearly and with great meaning and commonality. The presentation leads into design languages for digital products and this is where we tie in the component-oriented capabilities of React that make it easy to define a common language with your UI achieving similar results as discussed before but now within digital products. Truly amazing talk and I really suggest taking the time to watch. I also want to note that React Amsterdam has an amazing design language and have continued year over year to capitalize on this using a similar set of logos, typography, and design.&lt;/p&gt;

&lt;h3&gt;
  
  
  Designing with React (Mark Dalgleish)
&lt;/h3&gt;

&lt;p&gt;Following the previous design language presentation, we nicely transition into a talk from Mark Dalgleish on &lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=8562s" rel="noopener noreferrer"&gt;designing in React&lt;/a&gt;. Using design systems paired with React Mark is able to design in the final medium. Because React is so component oriented, it allows us to build our own domain specific language. I have seen first hand at companies I have worked at like Tesla capitalize on the ability to do this in React and other web technologies. Mark has some other examples of this idea spreading throughout our industry as many companies build their own design systems. Mark's major points back up the ability to capture the design intent from our design systems and applying them to the web and native apps. &lt;a href="https://github.com/seek-oss/seek-style-guide" rel="noopener noreferrer"&gt;Seek style-guide&lt;/a&gt; is something that Mark's company has created and is a great resource and example of a design system for React executed remarkably.&lt;/p&gt;

&lt;p&gt;Another amazing resource that Mark shows off is the &lt;a href="http://airbnb.io/react-sketchapp/" rel="noopener noreferrer"&gt;React Sketch.app&lt;/a&gt; which renders React components to Sketch helping to design with real data, in react with real component code and manage your design system implemented in React. Watch the video for information on an amazing npm package they created called &lt;code&gt;html-sketchapp&lt;/code&gt;. I will let you discover that amazing gem on your own.&lt;/p&gt;

&lt;h3&gt;
  
  
  Server Side Rendering Talks
&lt;/h3&gt;

&lt;p&gt;So far I'm 4 talks in, and I have watched the majority of the talks running back to our booth each break to interact with the attendees and talk components. For someone like me who just likes to be totally immersed in technology and talking about it, this event allows you to get into your element. It's great to have the support of a company like mine that gives us the opportunity to do these events in an organic way and let the people representing their product come here and just geek out on React. Aside from questions I had to field about our own component library, most of the talk at the conference was around fundamentals, bleeding edge features and the React roadmap, what's coming next. just an amazing conference to really get knee deep in JavaScript and React more specifically.&lt;/p&gt;

&lt;p&gt;The next four talks are all on Server Side Rendering (SSR) using frameworks like Next JS for pre-rendering, Crystalize for the backend to create lightning-fast scalable SSR React apps, the upsides and downsides of creating apps that use SSR, topics like rehydration, time to interactive and other things related to how our larger e-commerce sites render. In the e-commerce world, shaving milliseconds or maybe even full seconds off of load time can be very valuable. These 4 talks take you on a journey through the benefits and gotchas of SSR.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=10427s" rel="noopener noreferrer"&gt;Next for Next.js&lt;/a&gt; (Tim Neutkens)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=10991s" rel="noopener noreferrer"&gt;Lightning fast SSR React&lt;/a&gt; (Håkon Gullord Krogh)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=11452s" rel="noopener noreferrer"&gt;Speeding up React SSR&lt;/a&gt; (David Mark Clements)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=11870s" rel="noopener noreferrer"&gt;Demystifying Server-Rendered React Apps&lt;/a&gt; (Fernando Porazzi) &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lightning Round... One .. Start! (Read Rapidly and Fast)
&lt;/h2&gt;

&lt;p&gt;OK, really fast, let me tell you about the amazing lightning round talks, read this section really fast to get an idea of what lightning rounds are like. There were four amazing lightning talks, I caught two of them in person and watched the other two from home today and I have to say that I walked away from all of them with golden nuggets from each topic that I could use to explore that topic more on my own. below are the talks and a link to them on YouTube.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/4KfAS3zrvX8?t=15862" rel="noopener noreferrer"&gt;Fetch Like a Boss With React Async&lt;/a&gt; (Gert Hengeveld)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/4KfAS3zrvX8?t=16267" rel="noopener noreferrer"&gt;Microjob Multithreading&lt;/a&gt; (Vincenzo Ferrari)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/4KfAS3zrvX8?t=16656" rel="noopener noreferrer"&gt;URQL Powerful and Simple GraphQL&lt;/a&gt; (Andy Richardson)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/scottw/-git-history-5fpc-temp-slug-9335267"&gt;Showcase of Git History&lt;/a&gt; (Rodrigo Pombo)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm a huge fan of the library showcased in that last talk called &lt;a href="https://dev.to/scottw/-git-history-5fpc-temp-slug-9335267"&gt;Git-history&lt;/a&gt; and after being reminded of its awesomeness as React Amsterdam, I will be playing with this package and using it in some of my upcoming talks and demos to show the change when refactoring class based components to functional components with Hooks, I think this will provide a great visual aid in teaching on this subject. It's easy to use, I can show you right here.&lt;/p&gt;

&lt;p&gt;Take any file in any repo of your on GitHub. Like for instance, this article I am writing now:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://github.com/httpJunkie/telerik-blogs/blob/master/react-amsterdam-a-look-back.md&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Replace &lt;code&gt;http://github.com&lt;/code&gt; with &lt;code&gt;http://github.githistory.xyz&lt;/code&gt; resulting in the following string:&lt;code&gt;https://github.githistory.xyz/httpJunkie/telerik-blogs/blob/master/react-amsterdam-a-look-back.md&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here is a look at what Git History has done with my file from my repo:&lt;/p&gt;

&lt;p&gt;If you are not instantly in love with this, you don't exist. I showed my son and he was mesmerized, we noted that if I were to have saved more often, I would have a much more granular step through. This is my nomination for the next years GitNation Open Source Awards (which means nothing, because I'm in no way affiliated with GitNation lol). I just think it is people like Rodrigo who will be highlighted for their contributions to open source. Truly amazing, have I said that enough?&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Regrets at Spectrum (Max Stoiber)
&lt;/h2&gt;

&lt;p&gt;I admit that the SSR talks were a little bit over my head, but next up was &lt;a href="https://github.com/mxstbr" rel="noopener noreferrer"&gt;Max Stoiber&lt;/a&gt; to talk about his &lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=17600s" rel="noopener noreferrer"&gt;Tech Regrets at Spectrum&lt;/a&gt; which was acquired by GitHub. Another great talk and I don't want to spoil the regrets that Max goes over and I suggest taking a listen to this talk on your own to get the value of lessons learned from hindsight and his experience building a real-world product and shipping it to users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scaling Applications with Microfrontends (Max Gallo)
&lt;/h2&gt;

&lt;p&gt;Every once in a while there are talks at a conference where I think the guys on stage are on another level than me. TO be honest I have never built any micro frontends and if I did, I would have no idea how to scale them. When he asked for us to raise our hands if we had even heard of them, I was under strict contract to keep my hand down as I had never even heard of this. Once he started explaining the idea, I understood from a very high level. I like how his talk sets up three main tracks for understanding this micro frontends thing. Why do we need them? What is it? and how do they work under the hood? I was going to need all the hand holding I could get for this talk.&lt;/p&gt;

&lt;p&gt;Microfrontends are like a mix between microservices and the actual frontend single page application. Microfrontends are a way of splitting up the codebase of the frontend over many teams, obviously using some type of design system to keep them all similar in style and branding, we have already heard how to do this with extra benefit from React.&lt;/p&gt;

&lt;h2&gt;
  
  
  Women of React Amsterdam
&lt;/h2&gt;

&lt;p&gt;There was no better way to end the General React Track and the conference than to have three amazing talks by pioneering women in the React space. My absolute favorite talk from React Amsterdam was from Elizabet Oliveira. As well, I was truly inspired by both Peggy and Ashi because I'm slowly getting into GraphQL and to see WebGL and Hooks used together painting pixels has to be one of my runners up for second most inspiring talks at React Amsterdam.&lt;/p&gt;

&lt;h3&gt;
  
  
  An SVG's Tale (Elizabet Oliveira)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;t=21167s" rel="noopener noreferrer"&gt;An SVG's Tale&lt;/a&gt; like I said is my favorite talk. She is a senior UX designer at Optum in Ireland. If I could give an award for the most inspiring talk at React Amsterdam and the most likely to get me started playing with an old but amazingly robust technology that been given a new lease thanks to React, it's SVG. I have always been a huge fan of SVG, but after her talk, I have so many ideas of how I can use SVG's properly and dynamically in my React applications using inline methods or with JSX and components. It's possible with React JS to create animations and styling that under the React hood may be complex but can allow developers not as well versed in SVG to easily use them through your components. Beyond SVG and React, Elizabet showcases a few of her side projects over the years. One of them is an app that you can record your own vocals over dank hip-hop beats which &lt;a href="https://www.youtube.com/watch?v=4KfAS3zrvX8&amp;amp;feature=youtu.be&amp;amp;t=22153" rel="noopener noreferrer"&gt;Elizabet demo's for us with some amazing lyrical skills&lt;/a&gt;. This speaker definitely blew my mind and I wish I could have spotted her after the talk to give her a big thank you. Truly amazing presentation, she had everyone out of their seat cheering including myself and at other times fighting back tears because her (fictional) story was so amazing and warm and her performance was pure dope!&lt;/p&gt;

&lt;h3&gt;
  
  
  The GraphQL Developer Experience (Peggy Rayzis)
&lt;/h3&gt;

&lt;p&gt;Peggy Rayzis has to be the most compelling speaker on the topic of GraphQL especially for beginners like myself. It was one of the talks I was most amped up to hear and as happens in most conferences I got sidetracked and missed it ??. But listening back today I was not surprised at all when Peggy told us that she lived in Amsterdam for a month last year and that it is her favorite city in the world. I think most of us who came out for our first time to Amsterdam has the same feeling. I cannot think of a better backdrop for this event. It was my introduction to Europe proper! I enjoyed taking in all of the knowledge that Peggy brings to us on the subject of GraphQL and she has a great perspective as an employee for &lt;a href="https://www.apollographql.com/" rel="noopener noreferrer"&gt;Apollo&lt;/a&gt; where she works as an Engineering Manager. This company builds the most amazing implementation of GraphQL. Apollo helps us bridge the gap between application and API and I don't want to spoil her talk so I simply suggest checking this one out if you are interested in learning about GraphQL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Painting Pixels With WebGL And Hooks (Ashi Krishnan)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://ashi.io/" rel="noopener noreferrer"&gt;Ashi Krishnan&lt;/a&gt; is a seasoned speaker on so many different topics beyond React. She has been on my radar because of amazing talks like Deep Learning in React and Learning from machines. She works with GitHub in the UK and at React Amsterdam she closes out the General React track at React Amsterdam taking us on a journey into WebGL and how to leverage this journey with Hooks. This talk reminds me of the many things we can do in React that challenge the way we think about what a React application is and what it can do. I first started realizing all the amazing things we could do with React and rendering from Ken Wheeler's talk on building a drum machine or rendering web pages with canvas. &lt;a href="https://github.com/queerviolet" rel="noopener noreferrer"&gt;Ashi&lt;/a&gt; continues to challenge our thinking about React with an amazing live demo using WebGL to paint pixels in React. If I was able to select one talk that I believed mostly encompassed creativity and thinking outside of the box it would be this one. Without giving too much away, she runs through many demos truly artistic in nature that achieve different styles and approaches to painting the screen using WebGL in React.&lt;/p&gt;

&lt;h2&gt;
  
  
  The React Native Track
&lt;/h2&gt;

&lt;p&gt;Although I have "et, slept and breth'd" the General track at React Amsterdam I was not able to get over to the React Native track that often. But I did make a conscious effort to watch some of it. I have never used React Native but I have heard so many great things about it and did catch a few bits and pieces while I was at React Amsterdam. If I could point to one talk specifically that I think helped me understand React native better it would be the presentation given by the React Native core team member &lt;a href="https://github.com/nparashuram" rel="noopener noreferrer"&gt;Parashuram&lt;/a&gt; which just so happens to also be the first talk of this React native track: &lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=934s" rel="noopener noreferrer"&gt;Building React Native&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The React Native track &lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4" rel="noopener noreferrer"&gt;can be viewed in its entirety on YouTube&lt;/a&gt;. Below is a complete list of all of the talks you might want to hear! If you're more of a web developer and less of a native developer, I would suggest also checking out &lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=18906s" rel="noopener noreferrer"&gt;Native Web Apps&lt;/a&gt; by &lt;a href="https://github.com/4ian" rel="noopener noreferrer"&gt;Florian Rival&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On the React native track, we saw strong talks on &lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=2844s" rel="noopener noreferrer"&gt;Practical Perfomrance&lt;/a&gt; by Anna Doubková and &lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=17234s" rel="noopener noreferrer"&gt;Making React Applications Accessible&lt;/a&gt; by Ankita Kulkarni and &lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=25644s" rel="noopener noreferrer"&gt;Demystifying The Complex Animations Creation Process&lt;/a&gt; with Vladimir Novick. All were talks I was able to easily follow along not being a React Native developer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=934s" rel="noopener noreferrer"&gt;Building React Native&lt;/a&gt; (Parashuram N)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=2844s" rel="noopener noreferrer"&gt;Practical Performance for React Native&lt;/a&gt; (Anna Doubková)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=6291s" rel="noopener noreferrer"&gt;Sharing Code Between React and React Native&lt;/a&gt;: What Not to Share (Ben Ellerby)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=8150s" rel="noopener noreferrer"&gt;Building for a Bigger World Than Mobile&lt;/a&gt; (Wouter Van Den Broek)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=9801s" rel="noopener noreferrer"&gt;Advice Lounge&lt;/a&gt; (Panel Discussion)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=17234s" rel="noopener noreferrer"&gt;Make Your React Native Apps Accessible&lt;/a&gt; (Ankita Kulkarni)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=18906s" rel="noopener noreferrer"&gt;Native Web Apps&lt;/a&gt;: React and WebAssembly to Rewrite Native Apps (Florian Rival)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=20715s" rel="noopener noreferrer"&gt;Full-Stack React Native&lt;/a&gt; in the Era of Serverless Computing (Nader Dabit)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=25644s" rel="noopener noreferrer"&gt;Demystifying The Complex Animations Creation Process&lt;/a&gt; in React Native (Vladimir Novick)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=NCLkLCvpwm4&amp;amp;t=27212s" rel="noopener noreferrer"&gt;React Native App Rollout&lt;/a&gt; - an Alternative Approach (Adam Terlson)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Open Source Awards
&lt;/h2&gt;

&lt;p&gt;Since React Amsterdam at heart is a JavaScript conference, a love for open source is at the heart of every conference run by GitNation, they really do a great job of highlighting and recognizing great open source projects. This year they had several categories and you can watch the awards ceremony for more context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Breakthrough of The Year
&lt;/h3&gt;

&lt;p&gt;Taken home by &lt;a href="https://github.com/mweststrate" rel="noopener noreferrer"&gt;Michel Weststrate&lt;/a&gt; a Nederlander and main contributor of &lt;a href="https://github.com/immerjs/immer" rel="noopener noreferrer"&gt;Immer&lt;/a&gt; the popular open source library used to create the next mutatable state by mutating the current state. I have just barely scraped the surface of what this library can help with, but I have used it to make returning state from my reducers in React used to mutate (while keeping immutable) my local component state. I'm sure there are many other great uses for this library and I think it was well deserving of the award. Nominees for this award were &lt;a href="https://github.com/callstack/linaria" rel="noopener noreferrer"&gt;Linaria&lt;/a&gt;, &lt;a href="https://github.com/jaredpalmer/formik" rel="noopener noreferrer"&gt;Formik&lt;/a&gt; and &lt;a href="https://github.com/react-navigation/react-navigation" rel="noopener noreferrer"&gt;React-navigation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Most Exciting Technology
&lt;/h3&gt;

&lt;p&gt;This award was given to the &lt;a href="https://github.com/hshoff/vx" rel="noopener noreferrer"&gt;VX open source library&lt;/a&gt; that makes it easy to combine D3 charts into React to build amazing visual components. A demo can be seen on &lt;a href="https://vx-demo.now.sh/gallery" rel="noopener noreferrer"&gt;vx-demo.now.sh&lt;/a&gt; and shows how easy it is to make both your own reusable chart library or your own slick custom one-off charts. A representative was not available to take t his award home, but many props go out to the VX team for making such an amazing contribution to JS open source.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fun Side Project of The Year
&lt;/h3&gt;

&lt;p&gt;The title of the award says it all, this is just an open source contribution that GitNation believed to be fun, light-hearted and amazing in its own right. The nominees for this category were &lt;a href="https://github.com/React95/React95" rel="noopener noreferrer"&gt;React95&lt;/a&gt; (a play on Windows 95) is a React component library with Windows95 style UI. This would have also been my pick although I think both projects are absolutely fantastic. The next nominee was &lt;a href="https://github.com/mohitk05/react-insta-stories" rel="noopener noreferrer"&gt;React-insta-stories&lt;/a&gt; A React component for Instagram like stories. The component responds to actions like a tap on the right side for the next story, on left for previous and tap and hold for pause. The custom time duration for each story can be provided. The winner for this award was React95. Gabriel Daltoso and Alysson Dos Santos (São Paulo - Brazil) both came up on stage to accept this very well deserved award!&lt;/p&gt;

&lt;h3&gt;
  
  
  Most Impactful Contribution to The Community
&lt;/h3&gt;

&lt;p&gt;The winner of this award was &lt;a href="https://github.com/kentcdodds/react-testing-library" rel="noopener noreferrer"&gt;React-testing-library&lt;/a&gt;. Other nominees for this award were &lt;a href="https://github.com/wix/Detox" rel="noopener noreferrer"&gt;Detox&lt;/a&gt; and &lt;a href="https://github.com/react-navigation/react-navigation" rel="noopener noreferrer"&gt;React-navigation&lt;/a&gt;, and &lt;a href="https://github.com/downshift-js/downshift" rel="noopener noreferrer"&gt;Downshift&lt;/a&gt; and are all very impactful in our JS community. It should be and is noted by the announcers on stage that two of these libraries have the main contributor in common with Kent C Dodds. And if he wasn't given an award himself for most impactful and influential person to React Amsterdam, he should as well with a few other speakers who did both workshops and speaking at the conference, it just so happens that kent was able to pull off a trifecta in also winning an open source award, but there were many people wearing many hats speaking, volunteering, teaching workshops and overall just living and breathing this conference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Productivity Booster
&lt;/h3&gt;

&lt;p&gt;The final award category is all about being productive as a developer. The winner is near and dear to my heart as someone who loves to write in Markdown, I'm writing this article now in markdown using VS Code and I use Git to record my progress and iterations of each and every article I write for this blog. As well, I write many presentations and slide decks and love using markdown for those as well. As you can guess, the winner of this award went to &lt;a href="https://github.com/jxnblk/mdx-deck" rel="noopener noreferrer"&gt;MDX Deck&lt;/a&gt; and was accepted by &lt;a href="https://github.com/timneutkens" rel="noopener noreferrer"&gt;Time Neutkens&lt;/a&gt; and delivered to &lt;a href="https://github.com/jxnblk" rel="noopener noreferrer"&gt;Brent jackson&lt;/a&gt;. Other nominees for this category were &lt;a href="https://github.com/jaredpalmer/formik" rel="noopener noreferrer"&gt;Formik&lt;/a&gt;, &lt;a href="https://github.com/react-cosmos/react-cosmos" rel="noopener noreferrer"&gt;React-cosmos&lt;/a&gt;, and &lt;a href="https://github.com/tannerlinsley/react-table" rel="noopener noreferrer"&gt;React-table&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  React is Amsterdam
&lt;/h2&gt;

&lt;p&gt;Talk about how Amsterdam is a perfect city for JavaScript and more importantly React developers. Some of the sponsors at the vents were based in or had offices in Amsterdam or Netherlands. The city offers so much in historical, artistic, tech and shopping, so it's obviously a great place to bring the React community and is very relaxed yet highly invigorated at the same time. Given enough time and the ability to travel throughout the city and learn the Metro, Dutch national rail company NS (Nederlandse Spoorwegen) and the various other ferry and tram systems, you can easily move around to the areas that you want to visit and crank up the energy or turn it down by traveling just out of the city's center.&lt;/p&gt;

&lt;p&gt;I stayed in the &lt;a href="https://www.google.com/search?q=Wilbautstraat&amp;amp;rlz=1C1CHBF_enUS841US841&amp;amp;oq=Wilbautstraat" rel="noopener noreferrer"&gt;Wilbautstraat area&lt;/a&gt; just 4 stops off the metro from Central Station at a wonderful hotel that I talk about more in my &lt;a href="https://dev.to/httpjunkie/the-developers-guide-to-react-amsterdam-4h60/"&gt;Developers Guide to React Amsterdam&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  React 2020
&lt;/h2&gt;

&lt;p&gt;If you are planning on attending the React Amsterdam 2020 event, mark your calendars now, it will be April 16th and 17th. I know I'm missing other amazing things that happened, but hopefully, this can serve as a guide if you were not able to attend or maybe a tool you can use to convince your boss to go next year. If you do, stop by our booth and talk to me, I will definitely be going back in April of next year!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>Why Blazor Grid Templates Will Make You Question Everything</title>
      <dc:creator>Progress Telerik</dc:creator>
      <pubDate>Thu, 18 Apr 2019 11:30:00 +0000</pubDate>
      <link>https://dev.to/progresstelerik/why-blazor-grid-templates-will-make-you-question-everything-1057</link>
      <guid>https://dev.to/progresstelerik/why-blazor-grid-templates-will-make-you-question-everything-1057</guid>
      <description>&lt;p&gt;With native components, the Telerik UI for Blazor Grid templates can fully utilize the the best features of Blazor to highly customize the user experience.&lt;/p&gt;

&lt;p&gt;Using a template in an application implies that you're creating a custom experience for your user by leveraging a component or framework you're working with. Because the &lt;a href="https://www.telerik.com/blazor-ui" rel="noopener noreferrer"&gt;Telerik UI for Blazor&lt;/a&gt; components are native, built from the ground up using the Blazor framework, it can tap directly in to Blazor's best features. Grid component templates can fully utilize the HTML, Razor, and components to completely customize the user experience.&lt;/p&gt;

&lt;p&gt;In this article we'll see an overview of what templates are available and simple use cases. We'll use these as building blocks to see just how dynamic a Blazor grid can be when using templates for advanced ideas like custom editors and master-detail views.&lt;/p&gt;

&lt;h2&gt;
  
  
  Template Types
&lt;/h2&gt;

&lt;p&gt;There are currently three types of templates available for the Blazor grid: column Template, Editor Template, and Row Template. Each has very specific uses and are powerful tools for adapting the grid to your specific needs. Let's start with a quick introduction to each template type.&lt;/p&gt;

&lt;h3&gt;
  
  
  Column Template
&lt;/h3&gt;

&lt;p&gt;By default, the grid renders the value of the field in the column exactly as it's provided from the data source. We can override this behavior by using a column &lt;code&gt;Template&lt;/code&gt; which allows us to take control over the rendering of the object within the column. The Template provides the entire object currently bound to the row in which the column exists, and this object is the template's &lt;code&gt;context&lt;/code&gt;. Through the Template we can apply custom formatting, insert additional HTML and images, and display Razor Components using any value from the &lt;code&gt;context&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGridColumn Field="@(nameof(SampleData.Name))" Title="Employee Name"&amp;gt;
    &amp;lt;Template&amp;gt;
       Employee name is: @((context as SampleData).Name)
    &amp;lt;/Template&amp;gt;
&amp;lt;/TelerikGridColumn&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The column Template is visible when the current row is not in edit mode. To customize the grid's editing experience we'll use the &lt;code&gt;EditorTemplate&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Editor Template
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;EditorTemplate&lt;/code&gt; is a template that bound to the editing context. The &lt;code&gt;EditorTemplate&lt;/code&gt; defines the inline template or component that will be rendered when the user is editing the field. Although the &lt;code&gt;EditorTemplate&lt;/code&gt; acts much like the column Template, it is only shown when the given row is in edit mode.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGridColumn Field=@nameof(Employee.VacationDays) Title="Position"&amp;gt;
    &amp;lt;EditorTemplate&amp;gt;
        @{
            var employeeToUpdate = context as Employee;
&amp;lt;KendoNumericTextBox Decimals="1" Format="#.0 days" Max="15" Min="0" Step="0.5m" Value="@employeeToUpdate.VacationDays" /&amp;gt;
        }
    &amp;lt;/EditorTemplate&amp;gt;
&amp;lt;/TelerikGridColumn&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The column and editor templates give excellent control over column rendering in the grid. For even more control we can choose to use a row template and completely customize the grid.&lt;/p&gt;

&lt;h3&gt;
  
  
  Row Template
&lt;/h3&gt;

&lt;p&gt;Unlike the previously mentioned templates, the &lt;code&gt;RowTemplate&lt;/code&gt; spans the entire grid for all columns. The row template allows you to define custom rendering for the entire &lt;code&gt;&amp;lt;tr&amp;gt;&lt;/code&gt; element for each record. It can be convenient if you want to use templates for most or all of the columns, as it requires less markup than setting individual templates for many columns.&lt;/p&gt;

&lt;p&gt;Since the template isn't bound to a specific column, it can use the &lt;code&gt;Context&lt;/code&gt; attribute of the &lt;code&gt;RowTemplate&lt;/code&gt; to set the name of the context variable. Its type is the model type to which the grid is bound.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;RowTemplate Context="employee"&amp;gt;
    &amp;lt;td&amp;gt;
        &amp;lt;span&amp;gt;@employee.Id&amp;lt;/span&amp;gt;
    &amp;lt;/td&amp;gt;
    &amp;lt;td&amp;gt;
        Hired on: @(String.Format("{0:dd MMM yyyy}", employee.HireDate))
    &amp;lt;/td&amp;gt;
&amp;lt;/RowTemplate&amp;gt;
&amp;lt;TelerikGridColumns&amp;gt;
    &amp;lt;TelerikGridColumn Field=@nameof(SampleData.Name) Title="Employee Name" /&amp;gt;
    &amp;lt;TelerikGridColumn Field=@nameof(SampleData.HireDate) Title="Hire Date" /&amp;gt;
&amp;lt;/TelerikGridColumns&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using the three template types we can tackle a wide variety of requirements. Let's look at how flexible the &lt;a href="https://docs.telerik.com/blazor/components/grid/overview" rel="noopener noreferrer"&gt;Telerik UI for Blazor Grid&lt;/a&gt; can be - what we can accomplish might just surprise you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Image Template
&lt;/h2&gt;

&lt;p&gt;We'll begin with a simple yet common scenario, embedding an image in a grid column. Let's assume we have a list of users that we need to manage a broad range of details for. It be nice to associate a face with a name, and with a column template we can do just that. Using a column template we can use one or many values from the currently bound item's properties to generate an image element and display an image directly in the column. In this example we'll assume that our product's images are stored on the server with a relative path of &lt;code&gt;/images/&lt;/code&gt;, and each image file name corresponds to the &lt;code&gt;productId&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let's begin without a template to see how the grid is structured without customization.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGrid Data=@GridData Height="500"&amp;gt;
    &amp;lt;TelerikGridColumns&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.ProductName) Title="Product Name"/&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.UnitPrice) Title="Unit Price"/&amp;gt;
    &amp;lt;/TelerikGridColumns&amp;gt;
&amp;lt;/TelerikGrid&amp;gt; 

@functions {
    public IEnumerable&amp;lt;Product&amp;gt; GridData { get; set; }

    protected override void OnInit() =&amp;gt; GridData = ... //fetch data;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fgrid-plain.jpg%3Fsfvrsn%3Df9fd1feb_1" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fgrid-plain.jpg%3Fsfvrsn%3Df9fd1feb_1" title="grid-plain" alt="grid-plain" width="989" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here we have a basic two column grid with just a text display of each Product Name and Unit Price. Using a template we can transform the Product Name column to display an image alongside the product name.&lt;/p&gt;

&lt;p&gt;To access the template, the Product Name column needs to have a &lt;code&gt;TelerikGridColumn&lt;/code&gt; component with matching begin/end tags. Inside the component we'll add a &lt;code&gt;Template&lt;/code&gt; component which will define our custom rendering. Inside of the template we have access to the context object, this is the current &lt;code&gt;Product&lt;/code&gt; in scope. A simple cast of &lt;code&gt;context as Product&lt;/code&gt; will give us access to the proper type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGridColumn Field=@nameof(Product.ProductName) Title="Product Name"&amp;gt;
    &amp;lt;Template&amp;gt;
        @{
            var product = context as Product;
        }
    &amp;lt;/Template&amp;gt;
&amp;lt;/TelerikGridColumn&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we have our current Product we can render it how we see fit within the column. Let's add an HTML &lt;code&gt;&amp;lt;img&lt;/code&gt; tag and create a path from the &lt;code&gt;ProductId&lt;/code&gt; property. We can apply CSS to the image using standard HTML markup &lt;code&gt;class="rounded-circle"&lt;/code&gt;. Also, since this is Razor, C# string literals are a valid way of formating the path &lt;code&gt;src="@($"/images/{product.ProductId}.jpg")"&lt;/code&gt;. We'll also display the Product Name property along side the image using simple markup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGrid Data=@GridData Height="500"&amp;gt;
    &amp;lt;TelerikGridColumns&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.ProductName) Title="Product Name"&amp;gt;
            &amp;lt;Template&amp;gt;
                @{
                    var product = context as Product;
                    &amp;lt;img class="rounded-circle" src="@($"/images/{product.ProductId}.jpg")" /&amp;gt;
                    &amp;lt;span&amp;gt;@product.ProductName&amp;lt;/span&amp;gt;
                }
            &amp;lt;/Template&amp;gt;
        &amp;lt;/TelerikGridColumn&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.UnitPrice) Title="Unit Price"/&amp;gt;
    &amp;lt;/TelerikGridColumns&amp;gt;
&amp;lt;/TelerikGrid&amp;gt; 

@functions ...

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fimage-template.jpg%3Fsfvrsn%3D19f2bb74_1" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fimage-template.jpg%3Fsfvrsn%3D19f2bb74_1" title="image-template" alt="image-template" width="1257" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because the underlying Razor Components framework supports templates and the Telerik UI for Blazor Grid is built using the framework's native architecture, the grid is a fully capable solution to many problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom Form
&lt;/h2&gt;

&lt;p&gt;With templates we can fully utilize Blazor's framework features. Inside the template we can add components, logic, and even trigger events. In addition, templates aren't just scoped to the component they're contained in - we can access events and values outside of the template as well. This opens up new possibilities for creating a custom experience.&lt;/p&gt;

&lt;p&gt;Let's assume we want to create a custom edit experience versus using one of the &lt;a href="https://docs.telerik.com/blazor/components/grid/editing/overview.html" rel="noopener noreferrer"&gt;built in grid editors&lt;/a&gt;. This will give us full control over every aspect of the form. The challenge is getting the form to interact with the grid. To make a custom editor we'll need to select an item, place its properties on a form, and save/cancel changes. On the surface this might seem like a complex task, however the framework has extremely flexible data binding mechanics.&lt;/p&gt;

&lt;p&gt;Identifying the currently selected &lt;code&gt;object&lt;/code&gt; would provide most of what we need to accomplish the task since we can bind its properties directly to form elements. The grid's template gives us access to items that are bound to a grid row, all we'll need is a method of selecting the value and creating a reference to the object. Let's start by creating a placeholder for our object reference using a field named &lt;code&gt;selectedProduct&lt;/code&gt;. To create an easy way of selecting a product, a column template with a button will suffice. When the button is clicked, we'll invoke an in-line function to set &lt;code&gt;selectedProduct&lt;/code&gt; to the current context.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGridColumn Field=@nameof(Product.ProductId) Title="Id"&amp;gt;
    &amp;lt;Template&amp;gt;
        &amp;lt;TelerikButton Icon="edit" OnClick="@(_=&amp;gt; selectedProduct = (Product)context)"&amp;gt;Edit&amp;lt;/TelerikButton&amp;gt;
    &amp;lt;/Template&amp;gt;
&amp;lt;/TelerikGridColumn&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the data referenced we can now add a form to display the information and provide save and cancel actions. The form will exist outside of the grid, since the object reference is now scoped to the &lt;code&gt;page&lt;/code&gt; we can place the form anywhere outside the grid. The form can be hidden or shown based on if an item is selected using a standard Razor &lt;code&gt;@if&lt;/code&gt; block.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@if (selectedProduct != null) {
...form
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saving and canceling the edit are also straightforward tasks now. We just need to create buttons with corresponding &lt;code&gt;OnClick&lt;/code&gt; events. To cancel the edit, the &lt;code&gt;selectedProduct&lt;/code&gt; reference is simply reset to &lt;code&gt;null&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGrid Data=@GridData Height=@Height Pageable="true" PageSize=@PageSize&amp;gt;
    &amp;lt;TelerikGridColumns&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.ProductId) Title="Id"&amp;gt;
            &amp;lt;Template&amp;gt;
                &amp;lt;TelerikButton Icon="edit" OnClick="@(_=&amp;gt; selectedProduct = (Product)context)"&amp;gt;Edit&amp;lt;/TelerikButton&amp;gt;
            &amp;lt;/Template&amp;gt;
        &amp;lt;/TelerikGridColumn&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.ProductName) Title="Product Name" /&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.UnitPrice) Title="Unit Price" /&amp;gt;
    &amp;lt;/TelerikGridColumns&amp;gt;
&amp;lt;/TelerikGrid&amp;gt;
&amp;lt;hr /&amp;gt;
@if (selectedProduct != null)
{
    &amp;lt;div class="form-group "&amp;gt;
        &amp;lt;label class="control-label" for="productName"&amp;gt;
            Product Name
        &amp;lt;/label&amp;gt;
        &amp;lt;input class="form-control" bind="@selectedProduct.ProductName" id="name" name="name" type="text" /&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class="form-group "&amp;gt;
        &amp;lt;label class="control-label" for="unitPrice"&amp;gt;
            Unit Price
        &amp;lt;/label&amp;gt;
        &amp;lt;input class="form-control" bind="@selectedProduct.UnitPrice" id="unitPrice" name="unitPrice" type="number" /&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class="form-group"&amp;gt;
        &amp;lt;div&amp;gt;
            &amp;lt;TelerikButton Icon="save" Class="k-primary" OnClick="@Save"&amp;gt;Save&amp;lt;/TelerikButton&amp;gt;
            &amp;lt;TelerikButton Icon="cancel" OnClick="@(_=&amp;gt; selectedProduct = null)"&amp;gt;Cancel&amp;lt;/TelerikButton&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
}
@functions {
    ...
    Product selectedProduct;

    void Save()
    {
// save logic
        selectedProduct = null;
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fcustomeditor.gif%3Fsfvrsn%3Da416540_1" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fcustomeditor.gif%3Fsfvrsn%3Da416540_1" title="CustomEditor" alt="CustomEditor" width="369" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the ability to share state with other components on the page, the opportunities for template driven experiences are unlimited.&lt;/p&gt;

&lt;h2&gt;
  
  
  Master-Detail View
&lt;/h2&gt;

&lt;p&gt;Using templates we can completely transform an entire grid row with custom HTML, Razor, and even components. In this next example we'll look at just how advanced we can get with templates by adding a Master-Detail view to a grid.&lt;/p&gt;

&lt;p&gt;A likely scenario for any application is one where a data point has many properties with varying importance. Some of those properties should always be front and center, while others might be helpful to have just within reach. This is where a master-detail view can be quite handy. This type of view helps keep extended data out of view until it is requested by the user, while keeping critical data up front all of the time.&lt;/p&gt;

&lt;p&gt;Using the &lt;code&gt;RowTemplate&lt;/code&gt; we can define two different states for our row which can easily be toggled by a simple button click. We'll start with the default state which only displays two columns of data. This view is nicely tucked away in a custom component called &lt;code&gt;ProductMasterTemplate&lt;/code&gt; and takes a parameter of &lt;code&gt;Product&lt;/code&gt; to be displayed in a two column format.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ProductMasterTemplate Product="@product" /&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In addition, we'll use a more complex view to reveal all of the data for a given product in a list view. Once again, we'll encapsulate the view in custom component called &lt;code&gt;ProductDetailTemplate&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ProductDetailTemplate Product="@product"/&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Within each of these custom components are table data cells &lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt; that contain Razor code for displaying the properties of a given &lt;code&gt;Product&lt;/code&gt;. The contents of the row template must be &lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt; elements and their number (or total colspan) must match the number of columns defined in the grid. Internally both templates contain markup similar to the following example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;td&amp;gt;@Product.property&amp;lt;/td&amp;gt;
&amp;lt;td colspan="2"&amp;gt;
... some view logic
&amp;lt;/td&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the two states clearly defined as components we can focus on switching between the two. Let's begin by defining which item is selected by creating a variable where we can hold a reference to the selected product. As such, we'll name it &lt;code&gt;SelectedProduct&lt;/code&gt;. To enable the user to toggle between views, we'll need a set of buttons to display for the user. To show the details we'll simply check the &lt;code&gt;SelectedProduct&lt;/code&gt; to see if it matches the current item in the row. Since we're using Blazor, we can easily set the state of &lt;code&gt;SelectedProduct&lt;/code&gt; directly in the event handler with an in-line function, &lt;code&gt;OnClick="@(_=&amp;gt; SelectedProduct = ...)"&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;RowTemplate Context="product"&amp;gt;
        @if (SelectedProduct != product)
        {
            &amp;lt;td&amp;gt;
                &amp;lt;TelerikButton Icon="@IconName.Window" OnClick="@(_=&amp;gt; SelectedProduct = product)"&amp;gt;Details&amp;lt;/TelerikButton&amp;gt;
            &amp;lt;/td&amp;gt;
            &amp;lt;ProductMasterTemplate Product="@product" /&amp;gt;
        }
        else
        {
            &amp;lt;td&amp;gt;
                &amp;lt;TelerikButton Icon="@IconName.Close" OnClick="@(_=&amp;gt; SelectedProduct = null)"&amp;gt;Close&amp;lt;/TelerikButton&amp;gt;
            &amp;lt;/td&amp;gt;
            &amp;lt;ProductDetailTemplate Product="@product"/&amp;gt;
        }
    &amp;lt;/RowTemplate&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The completed code below is actually quite simple due to the combination of template and component architecture.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TelerikGrid Data=@GridData Height="@Height"&amp;gt;
    &amp;lt;RowTemplate Context="product"&amp;gt;
        @if (SelectedProduct != product)
        {
            &amp;lt;td&amp;gt;
                &amp;lt;TelerikButton Icon="@IconName.Window" OnClick="@(_=&amp;gt; SelectedProduct = product)"&amp;gt;Details&amp;lt;/TelerikButton&amp;gt;
            &amp;lt;/td&amp;gt;
            &amp;lt;ProductMasterTemplate Product="@product" /&amp;gt;
        }
        else
        {
            &amp;lt;td&amp;gt;
                &amp;lt;TelerikButton Icon="@IconName.Close" OnClick="@(_=&amp;gt; SelectedProduct = null)"&amp;gt;Close&amp;lt;/TelerikButton&amp;gt;
            &amp;lt;/td&amp;gt;
            &amp;lt;ProductDetailTemplate Product="@product"/&amp;gt;
        }
    &amp;lt;/RowTemplate&amp;gt;
    &amp;lt;TelerikGridColumns&amp;gt;
        &amp;lt;TelerikGridColumn Width="100" Field=@nameof(Product.ProductName) Title="Product" /&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.ProductName) Title="Product Name" /&amp;gt;
        &amp;lt;TelerikGridColumn Field=@nameof(Product.UnitsInStock) Title="Unit Price" /&amp;gt;
    &amp;lt;/TelerikGridColumns&amp;gt;
&amp;lt;/TelerikGrid&amp;gt;

@functions {
    Product SelectedProduct;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clicking the &lt;code&gt;Details&lt;/code&gt; button gives us a slick UI that allows us to drill into grid data.&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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fmasterdetail.gif%3Fsfvrsn%3Df056b4ab_1" 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%2Fd585tldpucybw.cloudfront.net%2Fsfimages%2Fdefault-source%2Fdefault-album%2Fmasterdetail.gif%3Fsfvrsn%3Df056b4ab_1" title="MasterDetail" alt="MasterDetail" width="400" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Because the Telerik UI for Blazor components are native, built from the ground up using the Blazor framework, it can tap directly in to Blazor's best features. Grid component templates can fully utilize the HTML, Razor, and components to completely customize the user experience. Simple templates are useful for formatting or displaying images, while more extensive templates can transform the user interface completely adding entirely new functionality to the grid.&lt;/p&gt;

&lt;p&gt;In this post we focused on the grid, however other components like the &lt;a href="https://docs.telerik.com/blazor/components/dropdownlist/overview" rel="noopener noreferrer"&gt;DropDownList&lt;/a&gt; already feature template fields as well. Make sure you &lt;a href="https://www.telerik.com/download-trial-file/v2-b/ui-for-blazor" rel="noopener noreferrer"&gt;download the latest release&lt;/a&gt; and try the templates for yourself using our &lt;a href="https://github.com/telerik/ui-for-blazor-examples" rel="noopener noreferrer"&gt;demo repository on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.telerik.com/download-trial-file/v2-b/ui-for-blazor" rel="noopener noreferrer"&gt;Try Telerik UI for Blazor&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>blazor</category>
    </item>
  </channel>
</rss>
