Drupal Planet

Web Wash: Drupal Live Site Build (Part 3) – Create Bootstrap Grid using Views and Display Related Content

4 weeks ago

In the show notes below, I outline what we implement in part 3 of the Drupal live site build. We’ll create a new content type called Portfolio which will have three fields, Body, Featured (media field) and a Portfolio category field.

Then we create a “Related project” block which will display other portfolio items which are related through the category field.

We use the Views module to create the block.

And then we create a listing page which displays the portfolio items as Bootstrap Card components in a grid layout.

Kalamuna Blog: Structuring Your Website and Content for SEO Success

4 weeks ago
Structuring Your Website and Content for SEO Success Jaida Regan Tue, 08/25/2020 - 07:34

In our last SEO article 5 Tips To Get Top SEO Results, we dove into the basics of getting your website ready for top SEO performance.

In this article, we will focus on some fundamental SEO principles to make sure you are getting the most out of your content.

Categories Analytics Articles Guidance Author Jason Blanda

Specbee: Integrating the Sharethis Block Module with Drupal 8 - A Comprehensive Tutorial

4 weeks ago
Integrating the Sharethis Block Module with Drupal 8 - A Comprehensive Tutorial Ankitha 25 Aug, 2020 Top 10 best practices for designing a perfect UX for your mobile app

One of the crucial web design tips to ensure your business success is to have social media buttons integrated on your website. Regardless of whether your website is pushing out blog posts or featuring products, you want your content to be shareable so that visitors can easily share among their friends or post to their own social media accounts directly from your website.

In this blog we shall walk you through making your content shareable with social share buttons by integrating it with your Drupal 8 website using one of the popular modules available - the ShareThis Drupal module.

Integrating social media sharing tools with your website enables a better user experience.  It is a great way to keep your audience engaged and also get some feedback. It helps grow your social reach and in turn can immensely boost the SEO of your website. So, what are you waiting for? Let's get started!

Customizing the social sharing buttons in Sharethis

Sharethis gives you various options to choose from so you can customize your social share buttons according to your website design and requirements. Before integrating the block with your Drupal website, let’s get started with customizing the social share buttons on the Sharethis website.

•    Visit Sharethis and hit start.

•    Next, you can select the type of sharing button that you would like for your website, either Inline or Sticky sharing buttons. The choice depends on your Drupal website design and your social sharing goals. Inline buttons are used when you want your social sharing buttons to appear at one particular position of your page, usually below the headline. While sticky buttons are can be placed at the side of the screen and be made available throughout the scrolling of the page. Research shows that 70% of websites prefer going with inline buttons. So, for now, let’s go with inline buttons.

•    On the same page you are shown a preview of the share buttons. You can now personalize these buttons by clicking on “Customize”.

•    You will be redirected to the page where you can customize your share buttons as per your need. The following settings are available:

    o    Select your social networks.

   o    Reorder the icons the way you prefer with just a drag and drop

   o    Choose an alignment that fits right in your design.

   o    Change the size and label of the icons. You can also include the number of shares done alongside the icons!  Style the corners of the icons as per your requirement.

•    Once you are done customizing the sharing buttons, click on Next. In the next step, you need to create an account with Sharethis if you are a new user or login directly if you already have an account. The last step is where you find the code that gets you started.

•    Find the Property ID on your Dashboard and copy it as it is needed to activate the ShareThis block on your Drupal site.

Adding the Sharethis block on your Drupal Website

I.    Enabling the Drupal Sharethis Block Module

     •    Download the Sharethis block Drupal module using your method of choice (composer recommended).

    •    Enable the module in your Drupal website.

II.    Configuring the Sharethis module in Drupal 8

     •    After enabling the Sharethis Drupal module, head to the settings form at this location - /admin/config/user-interface/sharethis.
     •    Enter your Property ID (copied previously from the Sharethis dashboard) and select whether you want the sticky or inline method (Inline buttons in this case).

III.    Placing the Sharethis Block

     •    Once you're done configuring the module you can place your Share this Drupal block on the website just like you would do with any other Drupal block. The block visibility settings in Block Layout can be used to determine which pages the ShareThis buttons should be shown on.

     •    Go to Structure > Block Layout, where you will choose the region to place it in. Next to the necessary region, you will click “Place block” and find the “ShareThis Block” on the available list. Another click on the “Place block” and, finally, on the “Save” button is all that's left.

     •    When configuring the block, you can select the content types and pages to display it on and user roles to display it to. The block title can be renamed to anything you would want users to see when they are supposed to share your content.
    •    Okay, that’s it! You can now see the social sharing buttons in your Drupal content pages as shown in the image below.


The above was the small example to integrate social media sharing modules on your Drupal website using the ShareThis Drupal module. Social media integration with your Drupal website can make your content more shareable. Not only do they help you increase awareness of your content, but also provide your visitors the opportunity to share your content easily. When choosing social share buttons, make sure you only choose the social networks that matter to you by customizing them. Placing the social sharing buttons completely depends on the layout of your Drupal website and your audience preference. You could always do an AB testing to check which type of buttons and their placements work best for you. Looking for Drupal experts to help you out with all your Drupal development needs? Please feel free to connect with us.

Drupal Planet Drupal 8 Drupal Development Drupal Module Drupal Drupal Tutorial Shefali ShettyApr 05, 2017 Subscribe For Our Newsletter And Stay Updated Subscribe

Leave us a Comment

  Shefali ShettyApr 05, 2017 Recent Posts Image Integrating the Sharethis Block Module with Drupal 8 - A Comprehensive Tutorial Image How to create and apply a patch with Git Diff and Git Apply commands for your Drupal website Image Improving Drupal 9 Performance with modules, best coding practices and the right server configuration Want to extract the maximum out of Drupal? TALK TO US Featured Success Stories

Know more about our technology driven approach to recreate the content management workflow for [24]7.ai


Find out how we transformed the digital image of world’s largest healthcare provider, an attribute that defined their global presence in the medical world.


Discover how a Drupal powered internal portal encouraged the sellers at Flipkart to obtain the latest insights with respect to a particular domain.


Droptica: OpenSocial - Everything You Need to Start Building an Online Community

4 weeks 1 day ago

Building an online community is a big challenge for many organisations. In times of remote work, online communication systems are becoming more and more needed. Not only companies are looking for intranet systems, but many NGOs also have changed meetings face-to-face into online meetings. In this post, I will show you how OpenSocial can help you with remote team collaboration.

OpenSocial is an opensource Drupal-based system. The official website of the project is https://www.getopensocial.com. At Drupal.org, installation instructions can be found under the address: https://www.drupal.org/project/social. Here you can also see that the project was launched in 2013. This means many years of development, which can be seen in the significant amount of functionalities available in the system. 
The project has recently received funding of EUR 1.25M. The money will be spent on even faster application development. 

Who uses OpenSocial

According to the website https://www.drupal.org/project/usage/social, currently, more than 800 community systems around the world are based on OpenSocial. One of the most interesting implementations is the Greenpeace organisation, a more detailed description can be found on the webpage:


The installation is similar to Drupal. You can find all the information you need here: https://www.drupal.org/docs/installing-drupal.

It is best to download the system files using Composer – the command for this can be found at: https://www.drupal.org/project/social.

In OpenSocial, during installation, you have additional options in the form of functionalities that can be turned on. There are a dozen or so of them, some are checked by default on the configuration form. Everyone can decide for themselves what to install. 

If this is your first OpenSocial installation, I suggest checking all options in order to see the full system capabilities after installation.

If you plan to use OpenSocial in your organisation, I recommend that you first do a trial installation on some test server or locally. I would conduct the proper installation only after a minimum of several days of testing and getting to know the system. 

System header

After the installation, you see a bar with links and icons at the top of the page, while on the left side - the logo, the "Explore" section for browsing content and users, and the icon that opens the search window. 

On the right side, there are icons for adding content, list of my groups, notifications for the currently logged in user, and the link to the profile. 

The header is also adapted to mobile devices. You can easily use the system on your phone.

The entire header looks very nice, and you immediately know what the icons are for. The people working on the UX/UI did an excellent job here. 

Main page

The home page is divided into two columns. The left column with a width of 67% is a stream of the latest information for a given user – the so-called "wall".

There is a form at the top of the left column allowing for adding content. The content may contain text and graphics. You can display the content only for logged-in users or also for non-logged-in users. 

The right column contains a few small sections with the following elements:

  • upcoming events for which the logged-in user is signed up,
  • upcoming events from the whole system,
  • new posts ("Topic" content type, I will describe it later),
  • newest groups,
  • new users. 

These elements in the right column allow for a quick review of new content and new users in the system. 

Home page content (and more)

Every post a user adds on OpenSocial is very similar to the posts added on popular social networks. Therefore, adding and reading this content is very intuitive.

A single post contains the following information:

  • post's author,
  • where the given post has appeared (e.g. in a group, in an event, etc.),
  • date of publication of the post,
  • visibility (who can see the post, e.g. only logged-in users, or members of the selected group),
  • graphics (optional),
  • post's content,
  • number of likes,
  • comment sections,
  • in the upper right corner, the author has options to edit or delete the entry. 

Groups – creating a new group

Creating groups, adding users to them, and creating content within groups is the key function in the system. For example, you can create groups for:

  • people working on a single project,
  • people with the same interests in the organisation,
  • people working in the same office or city.

When creating a group, in the first step, you provide the type. You can choose one of the following types:

  • "Public group". Everyone can see the group. Anyone can join without the moderator's approval. The content added to this group will be visible to logged-in and non-logged-in users.
  • "Open group". Everyone can see the group. Anyone can join without the moderator's approval. The content added to the group will be visible only to the users logged-in to the system (they do not have to be group members in order to read the content).
  • "Closed group". Everyone can see the group in the listings, but it can be joined only after being invited by the moderator. The content in the group is visible only to the group members.
  • "Secret group". The group is not visible in listings (e.g. new groups). The group can be joined only after being invited by the moderator. The content in the group is visible solely to the group members.
  • "Flexible group". Here you can set the group parameters individually. 

As you can see, the list of group types is very long and allows for various options and adapting it to any organisation.

In the second step of creating a group, you provide a name, description, and photo. You can also define the location: country, city and even street. Therefore, you have the ability to assign groups to specific locations. 

I recommend adding a photo because then the groups look nice in the system. 

Groups – browsing and adding content

After creating a group or entering an existing group, you will see a page consisting of three parts:

  • The group's header, where you can see the group's name, photo, group type, number of members, edit link and group menu. The menu contains links to the content (Stream), group information, events, topics, members list and member management page.
  • The left column having the width of 2/3 of the page, containing the content added to the group.
  • The right column contains information about upcoming events, new topics, and new people in the group.


An event is a type of content available on the system that includes a name, description, photo, as well as start and end dates. This works in the same way as Facebook events. 

An event can be assigned to a group and have limited visibility (public - for logged-in users or group members).

As part of the event, you can create content, e.g. inform about the event programme. You can also view the list of people signed up for the event.

"Topic" content type

It is used to create longer posts. In the form for adding this type of content, at the very beginning, you choose one of the three options:

  • blog
  • discussion
  • news

Then you add the header and the main photo. You also have an option to limit the visibility and to assign it to a specific group. 

In the "Description" field, you enter the text that you want to share with the website users. 

You can also add files as attachments to the message. 

"Landing Page" content type

It is a type of content built on the basis of the Paragraphs module. The editor can create a landing page from 7 available ready-made components. It works exactly the same as in the Droopler distribution; it just offers a little less options.

This type of content is great for promoting events or groups outside. For example, the editor can make a landing page with a description of an event or group. Then he can launch a paid campaign on Facebook, LinkedIn, etc. in order to attract users to that page. 

This way of building landing pages is very helpful in marketing activities. 

In the video below, you can see what adding sections within this content type look like.


User profile 

The user profile is an integral part of any social media platform. The developers of OpenSocial have also created an attractive-looking person profile. 

At the top of the page, you can add the user's photo and a background photo. There is also a space for providing the role within the organisation and the name of the organisation (e.g. Developer at Droptica).
In order to facilitate contact, you can enter the telephone number. 

At the end, you can write something about yourself, your experience, and your interests. 

Private messages 

In addition to sending messages visible to people from the group or all users in the system, it is also possible to send private messages to selected users. 

As in popular social networks, you can send a message to a single user or create a group chat and talk privately with several selected people. 

The module needs to be enabled after a default installation. 

Adjusting the system to one's own needs 

Many functionalities are ready when installing OpenSocial. However, there is nothing to prevent adding new ones. The whole system is based on Drupal and is written in PHP. OpenSocial is made available as an OpenSource project. You can freely modify it and adjust it to your needs. 

Five irritating things in OpenSocial

Of course, not everything in the system is perfect. Here are a few things that bother me:

  1. Adding a post reloads the page – it would be helpful for it to be in ajax, as we are used to in social media. 
  2. When adding a comment in a post on the home page that is not at the very top, you are not taken to that comment – you have to scroll down the page again to see it. 
  3. When editing an event, there is no "cancel" button to go back to the previous page without saving the changes. 
  4. Breadcrumb like "Page" content redirects to a subpage/node, and there you will see a blank page with the short text "No front-page content has been created yet."
  5. Another thing I feel is missing is the media module to reuse the same pictures easily. In Droopler 2.x, when this module was added, using the system became more convenient. 
Five cool things in OpenSocial

There are also some functions in the system that I must praise the authors for:

  1. Cutting out the images being added to different types of content makes them look very eye-catching. 
  2. The navigation looks nice – the icons are well-matched. You immediately know what and where to look for.
  3. A single post looks very similar to the one from Facebook or Twitter; anyone will easily navigate the system with such a content presentation. 
  4. The animation opening the search engine looks interesting. 
  5. The Landing Page is a very useful type of data for marketers. It is good that it has been taken into account. 


If you are looking for a system that will provide your organisation with online communication or internal communication within the company, you should seriously consider using OpenSocial. It costs you nothing to check it out, because it is an open source project, and you can install and test it for free. You can also extend it as you wish because it is Drupal

Vardot: How Marketing Has Evolved in a Post-COVID World

4 weeks 2 days ago

rachel_norfolk: Be kind to your organisers

1 month ago
Be kind to your organisers

Having had the joy of experiencing organised events etc from both sides of the coin, as a participant and as an organiser, I have had ample opportunity to notice one thing — people in open source communities can do one thing that makes the experience of organising so much more pleasant: commit early.

I see again and again organisers of conferences, from small meet-ups even up to DrupalCon itself, worrying whether people will buy the tickets they need for the event to be a success, right up until the last few weeks (and days!)


Droptica: Drupal Commerce – Sell Electronic Products

1 month ago

Drupal Commerce is a comprehensive tool for selling physical products over the Internet. In this post, we will show you how to set up a store with little effort, in order to sell electronic products, or more precisely – to sell access to any files. In addition to Commerce, I will use the Group module to achieve the goal.

In the previous post on building a shop in Drupal we showed how to configure the Commerce module to start selling various types of physical products. 

We will take a further step now – I will show you how to configure the system to sell electronic products, such as e-books, music or any other files, using Commerce in Drupal.

This goal can be achieved in several ways, and one of them is the combination of the power of Commerce and the Group module.

Why this method?
  • Not much coding,
  • authorisations handled by the system and the Group module,
  • you sell access to a private group in which the client sees its content,
  • simple way to expand the system for selling, e.g. video courses consisting of many parts,
  • files are being uploaded via the upload field, attached to the content type,
  • product contains a simple reference (field) to the group to which it is to be available after paying.
How does it work for the admin?
  1. You sell access to the group where the files for downloading are available.
  2. You add a private file to the content associated with the group.
  3. You create a product (Commerce) and provide the selected group as a reference.
How does it work for the client?
  1. Product added to the cart.
  2. Creating an account for the client during the purchase process. This must be set in the Commerce configuration. Having an account is necessary to assign the client to the group where files to which they are to receive access after a successful payment are added.
  3. Redirection to payment.
  4. After the payment is completed, access to the group is granted. Adding the client to the group works automatically and is carried out by an additional code that must be added.
  5. The user is redirected to the profile where they have access to files and groups.

install the Commerce and Group modules along with dependencies. 


In addition to the Group module itself, enable the Group Node module (it is part of the Group module) – thanks to it you will be able to determine which type of content will be associated with a given group.

Add the group type – the admin/group/types subpage

At this stage, in the type edition, you can add fields, set its permissions, roles and define the type of content associated with the group.

Add the new group – the admin/group subpage

If only one group type is created, then every group being created will be of that type. If there are more, select which type it should belong to when adding the group. 

On the admin/structure/types page, add the kind of content to be used as the content type in the group. 

Add a private file field to it.

Make sure you have a properly configured private file system in your Drupal. Next, in the field configuration, set the file to be kept as private, thanks to which it will not be visible to non-authorised people.

Create a content type related to the group.

The admin/group/types / manage/GROUPTYPENAME/content page lists the types of content that you can associate with a given group type.

You can do this using the Install button

Thanks to this, it will be possible to create the content intended only for the members of a given group. Thus, each file connected to the content will also be available for viewing only by the people in the group.

Add content with the file to the group

Edit the group and go to the Nodes tab

Here you can add to the group the existing content or create a new one. 
When creating a new entry, add a file to it. Now you can test if in fact, only the members of the group have access to the file. 


Add a new product type that will be used to sell electronic products. A detailed description of how to do this can be found in the previous section concerning the Commerce configuration.

In the product type, add a new field that will be a reference to the created group. 

Field type: Reference -> Other…
Position type: Group

The field can be single- or multi-valued.
In the field settings, check the types of groups to which the reference should apply.

In Commerce, you should have at least one payment method configured.

It is after a successful purchase process, and when the order status becomes "completed", that the membership to the selected group will be granted.


The main functionality that is assigning the client to the selected group with the file is carried out using the PHP code, which you have to write yourself, e.g. in a new module.

The example of such a code that assigns the client to the groups from the reference field is built using EventSubscriber, because your system should monitor and react only when the order is paid.

The solution I used
I have created a new commerce_groups module

A service has been added to the module – the file commerce_groups.services.yml

services:   commerce_groups:     class: '\Drupal\commerce_groups\EventSubscriber\AttachUserToGroup'     arguments: ['@entity_type.manager']     tags:       - { name: 'event_subscriber' }

The service is defined in the AttachUserToGroup class
One argument was added – entity_type.manager, because I needed to inject it as a dependency in the object constructor (Dependency Injection)
The event_subscriber tag informs Drupal that the class wants to log events triggered by other modules. 
The event we want to register is defined in the getSubscribedEvents method in the AttachUserToGroup class, inheriting from EventSubscriberInterface

static function getSubscribedEvents() {   $events['commerce_order.place.post_transition'] = ['orderCompleteHandler'];   return $events; }

commerce_order.place.post_transition is an event triggered after successful payment for the product.
orderCompleteHandler is a method that contains all the logic of what is to happen when a given event occurs. 
Below is an example of a working code that, after a successful transaction, assigns the client to all groups from the field_group_ref reference field.

 /**      * Add customer to group.      *      * @param WorkflowTransitionEvent $event      * @throws \Drupal\Core\Entity\EntityStorageException      */     public function orderCompleteHandler(WorkflowTransitionEvent $event) {       /** @var \Drupal\commerce_order\Entity\OrderInterface $order */       $order = $event->getEntity();       $uid_value = $order->get('uid')->getValue();       $gids = [];       foreach ($order->getItems() as $order_item) {         /** @var \Drupal\commerce_product\Entity\ProductVariation $product_variation */         $product_variation = $order_item->getPurchasedEntity();         $product = $product_variation->getProduct();         $group_value = $product->get('field_group_ref')->getValue();         foreach ($group_value as $group) {           $gids[] = $group['target_id'];         }       }       /** @var \Drupal\user\Entity\User $account */       $account = User::load($uid_value[0]['target_id']);       foreach ($gids as $gid) {         /** @var \Drupal\group\Entity\Group $group */         $group = Group::load($gid);         if ($group) {           $group->addMember($account);           $group->save();         }       }     } Displaying files in the group.

The quickest method is to create a view that on the main page of the group will display all the added files in the content related to the group.


Commerce and Group are two large, actively supported modules that, when combined, show the true power of Drupal. In an easy way, with a minimal amount of coding, you are able to build a complex and expandable system for selling both physical and electronic products. Both modules will be available in Drupal 9 – the latest version of the system.

Ramsalt Lab: Faster Drupal - Part 4: CSS/JS Tips

1 month ago
  • In our 4 part series on "Faster Drupal", we have so far published three different articles on: 

    1. Faster Drupal: Part 1: Caching
    2. Faster Drupal: Part 2: Aggregation, CDN and Image Optimization
    3. Faster Drupal: Part 3: Theming

    If you haven't already read those parts, go ahead and check them out! Now let's get to our beloved CSS/JS stuff!

    Faster Drupal - Part 4: CSS/JS Tips

    We’ve come to find this amazing blog post by Charlie Gerard, The first three items are from her blog post, I added the TL;DR version that we need for this guide but it's worth checking:

    CSS: Avoid modifying layout wherever possible: Changes to some CSS properties will require the whole layout to be updated. For example, properties like width, height, top, left (also referred to as “geometric properties”), require the layout to be calculated and the render tree to be updated.

    CSS: The descendant selector can be expensive: in an example like this: #nav a The browser is going to assess all the links on the page before settling to the ones actually inside our #nav section. A more performant way to do this would be to add a specific selector of .navigation-link on each <a> inside our #nav element. CSS: Browser reads selectors from right to left, so less selector the better

    • CSS: Some CSS properties are more expensive than others. What this means is that they take longer to paint.
      Some of these expensive properties include:
      1. border-radius
      2. box-shadow
      3. filter
      4. :nth-child
      5. position: fixed
    • Check to see if you are overriding your CSS selectors, there are IDE tools for that
    • Avoid duplicated CSS selectors, in large scale websites I’m pretty sure you can find a lot of them
    • Avoid !important declaration
    • Avoid DOM manipulation in javascript. If you really have toi do that (and often we do) keep the DOM updates to the bare minimum
    • The Drupal core will call attached behaviors when the DOM (the object representation of the HTML) is fully loaded and on each AJAX response altering the DOM.
    • Conditionally load assets where necessary! You have some JS or CSS only being used for certain nodes/content-types/pages? Load those files for those necessary pages only
    • Consider component-based themes that handle assets per component such as bootstrap_storybook
    • Use one of the methods below to defer parsing for external JavaScript files:
      1. Use the async attribute
      2. Use the defer attribute
    • Append the script to the DOM in JavaScript during the onload event
    • Make sure your scripts are placed at the bottom of the page (ideally at the end of the body) unless you really need it to be in the head..
    • Be sure to deliver the lightest possible font format. And also note the order of fonts loading is important as well. The preferred order of web font formats are as follows:
      1. EOT
      2. WOFF2
      3. WOFF
      4. TTF
      5. SVG
    • Try vanilla JS instead of jQuery: I mean we all love jQuery and it has saved us a lot of time and headache in the past, however nowadays you might not need jQuery for most of day-to-day operations.
      That said.. Sometimes you gotta do what you gotta do, but even then: do yourself a favour and use the latest jQuery available, not the default which comes with Drupal core to get the most updated library.
      • In Drupal 8 you can go one step further: Since D8 jQuery is not automatically loaded in the frontend so you can remove the jquery dependency from your theme's libraries and just use Vanilla JS!
    • Consider making a CSS/Image sprite out of your icons, especially if your users are still heavily using HTTP1.1.
      On the other hand if most of your traffic si via HTTP2 the number of your requests to the server are not really an issue (but don't go crazy)!

    Are we done with this list? Never! We would like to continuously improve it.

    We would also love to have your comments and suggestions!



    Written by Sohail Lajevardi
    Developer at Ramsalt Lab

    Nonprofit Drupal posts: August Drupal for Nonprofits Chat

    1 month ago

    Our normally scheduled call to chat about all things Drupal and nonprofits will happen TOMORROW, Thursday, August 20, at 1pm ET / 10am PT. (Convert to your local time zone.)

    No set agenda this month -- we can discuss whatever Drupal related thoughts are on your mind. If you would like to contribute to the conversation, please join us. 

    All nonprofit Drupal devs and users, regardless of experience level, are always welcome on this call.

    Feel free to share your thoughts and discussion points ahead of time in our collaborative Google doc: https://nten.org/drupal/notes

    This free call is sponsored by NTEN.org but open to everyone.

    View notes of previous months' calls.

    Jeff Geerling's Blog: Did breaking backwards compatibility kill Drupal?

    1 month ago
    Did breaking backwards compatibility kill Drupal?

    First of all, Drupal is not dead. But I would argue it's not in healthy place relative to competing projects as it was in its heyday, in the early 2010s.

    In this blog post, I will explore the problem the Drupal community finds itself in five years after a major release that broke backwards compatibility in almost every subsystem, forcing a laborious upgrade process and process shift that left many users in the dust.

    I've written about this in the past, most famously in my post Drupal 8 successes and failures. I'm not going to rehash the details from that post, but I did want to focus on what I think is the primary reason for this graph's downward trajectory since 2016:

    Jeff Geerling August 19, 2020

    Promet Source: Pros and Cons of 5 Web Accessibility Tools

    1 month ago
    While the need for web accessibility was not envisioned when the Americans with Disabilities Act was signed into law 30 years ago this summer, ADA web accessibility has emerged as a top-of-mind topic and a fundamental necessity. This has prompted a proliferation of new tools to evaluate the accessibility of websites. While a majority of these tools were designed to support current Web Content Accessibility Guidelines (WCAG 2.1) they vary in the number and types of errors they detect and the degree to which they can help ensure ADA Accessibility compliance. 
    3 minutes 37 seconds ago
    Drupal.org - aggregated feeds in category Planet Drupal
    Subscribe to Drupal Planet feed