{"jsonapi":{"version":"1.0","meta":{"links":{"self":{"href":"http:\/\/jsonapi.org\/format\/1.0\/"}}}},"data":[{"type":"node--project_module","id":"6f8d5b16-b15d-4f5c-b94c-c00c80210f2d","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6f8d5b16-b15d-4f5c-b94c-c00c80210f2d?resourceVersion=id%3A20051321"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6f8d5b16-b15d-4f5c-b94c-c00c80210f2d?resourceVersion=rel%3Aworking-copy"}},"attributes":{"drupal_internal__nid":3187132,"status":true,"title":"Editoria11y Accessibility Checker","created":"2020-12-08T01:52:59+00:00","changed":"2026-04-08T10:51:51+00:00","moderation_state":null,"body":{"value":"\u003Cp\u003EEditoria11y (\u0022editorial accessibility ally\u0022) is built around the key needs for ongoing quality assurance, both before and after a site launch:\u003C\/p\u003E\r\n    \r\n\u003Col\u003E\r\n  \u003Cli\u003ETests run in real-time, offering inline corrections and advice \u003Cstrong\u003Eas authors type\u003C\/strong\u003E in CKEditor in Gutenberg.\u003Cbr\u003E\u0026nbsp;\u003C\/li\u003E\r\n  \u003Cli\u003EIt checks \u003Cstrong\u003Erendered content\u003C\/strong\u003E in published pages and previews, allowing it to detect issues that only appear after Drupal assembles the content.\u003Cbr\u003E\u0026nbsp;\u003C\/li\u003E\r\n  \u003Cli\u003ETips use \u003Cstrong\u003Eplain language\u003C\/strong\u003E, to both correct and teach.\u003Cbr\u003E\u0026nbsp;\u003C\/li\u003E\r\n  \u003Cli\u003E\u003Cstrong\u003EResults are private\u003C\/strong\u003E. Tests run in-browser, and reports are stored on your own server.\u003C\/li\u003E\r\n\u003C\/ol\u003E\r\n  \u003Cp\u003E Editoria11y is meant to supplement, not replace, \u003Cstrong\u003E\u003Ca href=\u0022https:\/\/webaim.org\/resources\/evalquickref\/\u0022\u003Etesting with comprehensive tools and real assistive devices\u003C\/a\u003E\u003C\/strong\u003E\u003C\/p\u003E.\r\n\r\n\u003Ch2\u003EDemos\u003C\/h2\u003E\r\n\u003Cp\u003ENote that these show what an \u003Cstrong\u003E\u003Cem\u003Eauthor\u003C\/em\u003E\u003C\/strong\u003E would experience; the Editoria11y checker does not appear for anonymous users on a real site.\u003C\/p\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/editoria11y.princeton.edu\/demo\/\u0022\u003E\u003Cimg width=\u0022300\u0022 src=\u0022\/files\/Screenshot%202025-01-15%20at%204.04.05%E2%80%AFPM.png\u0022 alt=\u0022\u0022\u003E\u003Cbr\u003E\u003Cstrong\u003EInteractive Demo\u003C\/strong\u003E\u003C\/a\u003E\u003Cbr\u003E\u0026nbsp;\u003C\/li\u003E\r\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/youtu.be\/dnfQ8G-haXs?feature=shared\u0026t=2250\u0022\u003E\u003Cimg src=\u0022https:\/\/www.drupal.org\/files\/drupalcon-singapore-sm.png\u0022 alt=\u0022\u0022 width=\u0022300\u0022\u003E\u003Cbr\u003E\u003Cstrong\u003EVideo: authoring interface\u003C\/strong\u003E\u003C\/a\u003E tour \u003Cem\u003E(thanks to \u003Ca href=\u0022https:\/\/www.drupal.org\/u\/the_g_bomb\u0022\u003EGareth Alexander\u003C\/a\u003E)\u003C\/em\u003E\u003Cbr\u003E\u0026nbsp;\u003C\/li\u003E\r\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/youtu.be\/9hev_6L8SPk?feature=shared\u0026t=764\u0022\u003E\u003Cimg src=\u0022https:\/\/www.drupal.org\/files\/govcon-editoria11y.png\u0022 alt=\u0022\u0022 width=\u0022300\u0022\u003E\u003Cbr\u003E\u003Cstrong\u003EVideo: 2.1.x (previous version) authoring interface\u003C\/strong\u003E\u003C\/a\u003E and \u003Ca href=\u0022https:\/\/youtu.be\/9hev_6L8SPk?feature=shared\u0026t=1109\u0022\u003E\u003Cstrong\u003Esite reports\u003C\/strong\u003E\u003C\/a\u003E\u003Cbr\u003E\u0026nbsp;\u003C\/li\u003E\r\n\r\n\u003C\/ul\u003E\r\n\r\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\r\n\r\n\u003Ch2\u003EThe authoring experience\u003C\/h2\u003E\r\n\r\n\u003Cp\u003EWhen authenticated users with appropriate roles are viewing pages, Editoria11y\u0027s toggle indicates what was found (no issues, some definite issues found, only some manual checks needed):\u003C\/p\u003E\r\n\u003Cimg src=\u0022https:\/\/www.drupal.org\/files\/toggles_3.png\u0022 alt=\u0022toggle with no issues, 3 issues and 26 issues\u0022 width=\u0022300\u0022 \/\u003E\r\n\r\n\u003Cp\u003EWhen the toggle is clicked, alerts are placed on elements with issues, with tooltips that explain the problem and what actions are needed to resolve it. If the item might be a false positive, buttons are available to ignore the alert on this page for the current user or for all users (\u0022Mark as Checked and OK\u0022). By default, these alerts appear automatically the first time new issues are detected:\u003C\/p\u003E\r\n\r\n\u003Cimg src=\u0022\/files\/Screenshot%202024-11-20%20at%203.55.28%E2%80%AFPM.png\u0022 alt=\u0022Open tooltip indicating a manual check is needed for a link labelled only \u0022click here\u0022\u0022 \/\u003E\r\n\r\n\r\n\u003Cp\u003EThe main panel allows authors to step through the issues on the page, restore previously dismissed alerts, and visualize \u003Cstrong\u003E\u003Ca href=\u0022https:\/\/accessibility.princeton.edu\/how\/content\/alternative-text\u0022\u003Etext alternatives for images on the page\u003C\/a\u003E\u003C\/strong\u003E (\u0022alts\u0022) and the \u003Cstrong\u003E\u003Ca href=\u0022https:\/\/accessibility.princeton.edu\/how\/content\/headings\u0022\u003Edocument\u0027s heading outline\u003C\/a\u003E\u003C\/strong\u003E.\u003C\/p\u003E\r\n\r\n\u003Cimg src=\u0022\/files\/Screenshot 2024-11-20 at 4.22.58%E2%80%AFPM.png\u0022 alt=\u0022Open heading and alt text panels, showing the document outline and alt text for each image.\u0022 \/\u003E\r\n\r\n\u003Cp\u003EWhen sync is enabled, all issues detected can be reviewed in the Reports section of the administrative toolbar:\u003C\/p\u003E\r\n\u003Cimg src=\u0022\/files\/Screen%20Shot%202022-09-26%20at%2010.46.09%20AM.png\u0022 alt=\u0022Admin results tables showing most recent issues and issues organized by type.\u0022 \/\u003E\r\n\r\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\r\n\r\n\u003Ch3\u003EThe tests\u003C\/h3\u003E\r\n\r\n\u003Cul\u003E\r\n\t\u003Cli\u003E\u003Cstrong\u003E\u003Ca href=\u0022https:\/\/accessibility.princeton.edu\/how\/content\/alternative-text\u0022\u003EText alternatives\u003C\/a\u003E\u003C\/strong\u003E\r\n\t\u003Cul\u003E\r\n\t\t\u003Cli\u003EImages with no alt text\u003C\/li\u003E\r\n\t\t\u003Cli\u003EImages with a filename as alt text\u003C\/li\u003E\r\n\t\t\u003Cli\u003EImages with very long alt text\u003C\/li\u003E\r\n\t\t\u003Cli\u003EAlt text that contains redundant text like \u201cimage of\u201d or \u201cphoto of\u201d\u003C\/li\u003E\r\n\t\t\u003Cli\u003EImages in links with alt text that appears to be describing the image instead of the link destination\u003C\/li\u003E\r\n\t\t\u003Cli\u003EEmbedded visualizations that usually require a text alternative\u003C\/li\u003E\r\n\t\u003C\/ul\u003E\r\n\t\u003C\/li\u003E\r\n\t\u003Cli\u003E\u003Cstrong\u003E\u003Ca href=\u0022https:\/\/accessibility.princeton.edu\/how\/content\/links\u0022\u003EMeaningful links\u003C\/a\u003E\u003C\/strong\u003E\r\n\t\u003Cul\u003E\r\n\t\t\u003Cli\u003ELinks with no text\u003C\/li\u003E\r\n\t\t\u003Cli\u003ELinks titled with a filename\u003C\/li\u003E\r\n\t\t\u003Cli\u003ELinks only titled with generic text: \u201cclick here,\u201d \u201clearn more,\u201d \u201cdownload,\u201d etc.\u003C\/li\u003E\r\n\t\t\u003Cli\u003ELinks that open in a new window without warning\u003C\/li\u003E\r\n\t\u003C\/ul\u003E\r\n\t\u003C\/li\u003E\r\n\u003Cli\u003E\u003Cstrong\u003E\u003Ca href=\u0022https:\/\/accessibility.princeton.edu\/how\/content\/headings\u0022\u003EDocument outline and structure\u003C\/a\u003E\u003C\/strong\u003E\r\n\t\u003Cul\u003E\r\n\t\t\u003Cli\u003ESkipped heading levels\u003C\/li\u003E\r\n\t\t\u003Cli\u003EEmpty headings\u003C\/li\u003E\r\n\t\t\u003Cli\u003EVery long headings\u003C\/li\u003E\r\n                \u003Cli\u003ESuspiciously short blockquotes that may be fake headings\u003C\/li\u003E\r\n                \u003Cli\u003EAll-bold paragraphs with no punctuation that may need heading tags\u003C\/li\u003E\r\n                \u003Cli\u003ESuspicious patterns of paragraph prefixes that may need list tags (e.g. *, \u2022, \u2611\ufe0f, \ud83d\udc49, or incrementing numbers\/letters)\u003C\/li\u003E\r\n\u003Cli\u003ETables without headers, and overrides for the CKEditor5 table plugin to \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/editoria11y\/issues\/3527991\u0022\u003Einsert new tables with header rows or columns by default\u003C\/a\u003E\u003C\/li\u003E\r\n\u003Cli\u003ETables with document headers (\u0022Header 3\u0022) instead of table headers (\u0026lt;th\u0026gt;) \u003C\/li\u003E\r\n\t\u003C\/ul\u003E\r\n\t\u003C\/li\u003E\r\n\u003Cli\u003EGeneral quality assurance\r\n\u003Cul\u003E\r\n\t\u003Cli\u003ELARGE QUANTITIES OF CAPS LOCK TEXT\u003C\/li\u003E\r\n\t\u003Cli\u003ELinks to PDFs and other documents, reminding the user to test the download for accessibility or provide an alternate, accessible format\u003C\/li\u003E\r\n\t\u003Cli\u003EVideo embeds, reminding the user to add closed captions\u003C\/li\u003E\r\n\t\u003Cli\u003EAudio embeds, reminding the user to provide a transcript\u003C\/li\u003E\r\n\t\u003Cli\u003ESocial media embeds, reminding the user to provide alt elements\u003C\/li\u003E\u003C\/ul\u003E\r\n\u003C\/li\u003E\r\n\u003C\/ul\u003E\r\n\r\n\r\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\r\n\r\n\r\n\u003Ch2\u003EInstallation and configuration\u003C\/h2\u003E\r\n\r\n\u003Cp\u003EEditoria11y is included in the Drupal CMS Accessibility Tools recipe available on install.\u003C\/p\u003E\r\n\r\n\u003Cp\u003EIf you prefer to watch: \u003Cstrong\u003E\u003Ca href=\u0022https:\/\/youtu.be\/uYvNYPg38nU?feature=shared\u0026t=579\u0022\u003E2.x Installation \u0026 Configuration Tips Video\u003C\/a\u003E\u003C\/strong\u003E.\u003C\/p\u003E\r\n\r\n\u003Cp\u003EIf you are installing from the command line, do note the \u003Cstrong\u003E\u003Ca href=\u0022https:\/\/www.a11yproject.com\/\u0022\u003E\u0022eleventy\u0022\u003C\/a\u003E\u003C\/strong\u003E when spelling the module\u0027s name! Those are not L\u0027s.\u003C\/p\u003E\r\n\r\n\u003Cp\u003EEditoria11y\u0027s default configuration (or the Drupal CMS \u0022Accessibility Tools\u0022 recipe) should work decently on most sites, but the following items should be reviewed:\u003C\/p\u003E\r\n\u003Col\u003E\r\n\u003Cli\u003E\u003Cstrong\u003E\u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=uYvNYPg38nU\u0026t=718s\u0022\u003EReview roles and permissions\u003C\/a\u003E\u003C\/strong\u003E. Users must have the \u0022View Editoria11y Checker\u0022 permission to see the checker, and there are \u003Cstrong\u003Eseparate\u003C\/strong\u003E permissions to enable the \u0022ignore\u0022 and \u0022mark OK\u0022 buttons, and to review the site-wide reports. The module attempts to enable the first two by default on roles with common node edit permissions; you should add \u0022mark OK\u0022 to trusted roles and \u0022view dashboard\u0022 as you deem fit.\u003C\/li\u003E\r\n\u003Cli\u003EClick through key pages and at least one page for each content type on your site, paying special attention to custom views and embeds, to look for theme-level issues or false positives. Fix these issues before rolling the module out, or add selectors to the \u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=uYvNYPg38nU\u0026t=862s\u0022\u003E\u003Cstrong\u003Emodule configuration\u0027s \u0022skip over these elements\u0022 list\u003C\/strong\u003E\u003C\/a\u003E to suppress repeated alerts (e.g., \u0022#sidebar-menu a, .custom-card-view h3\u0022), or set the checker to only check regions your editors can modify (e.g., \u0022main, #footer-content\u0022). Please do not skip this step! You will prevent frustration for your editors, and viewing the nodes will populate your reporting dashboard.\u003C\/li\u003E\r\n\u003Cli\u003ESelect a color theme that works well with your site. Light and dark are available in the GUI; custom colors can be injected using JS parameters.\u003C\/li\u003E\r\n\u003Cli\u003ETell us how it went! This module and its base library are both under active development. Send thoughts through the issue queue or find \u003Ccode\u003Eitmaybejj\u003C\/code\u003E on the Drupal Slack\u003C\/li\u003E\r\n\u003C\/ol\u003E\r\n\r\n\u003Cp\u003EThere are many additional configuration options available on the module page for more complicated situations: selectors for \u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=uYvNYPg38nU\u0026t=1261s\u0022\u003Eshadow components to check\u003C\/a\u003E, changes to which document filetypes should be flagged, the ability to \u003Ca href=\u0022https:\/\/youtu.be\/uYvNYPg38nU?feature=shared\u0026t=1454\u0022\u003Edisable checking if certain selectors are present or absent\u003C\/a\u003E (user does not have an edit button on this content type), etc.\u003C\/p\u003E\r\n\r\n\u003Cp\u003EThe ReadMe also details a method for developers to programmatically modify JS parameters at runtime, which can be used to inject custom defaults on multi-site installs, handle long skip-element lists without cluttering the GUI, modify the color scheme or even rewrite tooltip messages.\u003C\/p\u003E\r\n\r\n\u003Cp\u003EAlso note that the library dispatches JavaScript events at key moments (scan finishes, panel opens, tooltip opens or shuts...), allowing developers to attach custom functionality. JavaScript on sites running Editoria11y can watch for these events to automatically open accordion widgets if they contain hidden alerts, to disable \u0022sticky\u0022 site menus when the panel opens, or even to sync the count and type of alerts found to third-party analytics platforms.\u003C\/p\u003E\r\n\r\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\r\n\r\n\u003Ch2\u003ESee also\u003C\/h2\u003E\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai_editoria11y\u0022\u003E\u003Cstrong\u003EAI: Editoria11y\u003C\/strong\u003E\u003C\/a\u003E adds a \u0022Fix with AI\u0022 button to tool-tips while editing, which displays a dialog with suggestions for revising the content.\u003C\/li\u003E\r\n\u003Cli\u003ENate Millins\u0027 \u003Cstrong\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/editoria11y_si\u0022\u003EEditoria11y SI\u003C\/a\u003E\u003C\/strong\u003E connector module uses SiteImprove data to highlight broken links inline.\u003C\/li\u003E\r\n\u003Cli\u003EThe Editoria11y library is developed in parallel with the \u003Cstrong\u003E\u003Ca href=\u0022https:\/\/sa11y.netlify.app\/\u0022\u003ESa11y accessibility checker\u003C\/a\u003E\u003C\/strong\u003E, and they have almost identical core test suites. Editoria11y focuses on providing a minimalist GUI and provides additional admin-facing tools like site-wide reporting and dismissal governance; Sa11y provides additional author-facing tools like color checking and readability scoring. There is a \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/sa11y\u0022\u003E\u003Cstrong\u003EDrupal wrapper for Sa11y\u003C\/strong\u003E\u003C\/a\u003E.\u003C\/li\u003E\r\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/decorative_image_widget\u0022\u003E\u003Cstrong\u003EDecorative Image Widget\u003C\/strong\u003E\u003C\/a\u003E makes alt text required unless the user checks a box to affirm the image is decorative.\u003C\/li\u003E\r\n\u003C\/ul\u003E\r\n\u003Cp\u003ENote that modules that claim they can \u003Cstrong\u003E\u003Cem\u003Efix\u003C\/em\u003E\u003C\/strong\u003E issues automatically based on AI or the like, or provide untested at-runtime theme modifications, are \u003Ca href=\u0022https:\/\/overlayfactsheet.com\/\u0022\u003E\u003Cstrong\u003Enot recommended by many disabled Web users\u003C\/strong\u003E\u003C\/a\u003E.\u003C\/p\u003E\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\r\n\r\n\r\n\u003Ch2\u003EAdvanced configuration and custom tests\u003C\/h2\u003E\r\nThe \u003Ca href=\u0022https:\/\/editoria11y.princeton.edu\/install\/\u0022\u003E\u003Cstrong\u003Elibrary configuration guide\u003C\/strong\u003E\u003C\/a\u003E has details and examples for parameters not exposed in the GUI, including how to write custom tests and how to open tabs and accordions before highlighting hidden alerts. There is also a \u003Ca href=\u0022https:\/\/youtu.be\/uYvNYPg38nU?feature=shared\u0026t=1648\u0022\u003E\u003Cstrong\u003Evideo guide to the JS events and test system\u003C\/strong\u003E\u003C\/a\u003E.\u003C\/p\u003E\u003Cp\u003EThe \u003Ca href=\u0022https:\/\/git.drupalcode.org\/project\/editoria11y\/-\/blob\/2.1.x\/README.md#extending-and-modifying-editorially\u0022\u003E\u003Cstrong\u003Emodule ReadMe has instructions for modifying these parameters\u003C\/strong\u003E\u003C\/a\u003E within a Drupal theme or module.\r\n\r\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\r\n\r\n\u003Ch2\u003EProject Info\u003C\/h2\u003E","format":"1","processed":"\u003Cdiv class=\u0022toc-filter\u0022\u003E\u003Cp\u003EEditoria11y (\u0022editorial accessibility ally\u0022) is built around the key needs for ongoing quality assurance, both before and after a site launch:\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003ETests run in real-time, offering inline corrections and advice \u003Cstrong\u003Eas authors type\u003C\/strong\u003E in CKEditor in Gutenberg.\u003Cbr\u003E\u0026nbsp;\u003C\/li\u003E\n\u003Cli\u003EIt checks \u003Cstrong\u003Erendered content\u003C\/strong\u003E in published pages and previews, allowing it to detect issues that only appear after Drupal assembles the content.\u003Cbr\u003E\u0026nbsp;\u003C\/li\u003E\n\u003Cli\u003ETips use \u003Cstrong\u003Eplain language\u003C\/strong\u003E, to both correct and teach.\u003Cbr\u003E\u0026nbsp;\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003EResults are private\u003C\/strong\u003E. Tests run in-browser, and reports are stored on your own server.\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003E Editoria11y is meant to supplement, not replace, \u003Cstrong\u003E\u003Ca href=\u0022https:\/\/webaim.org\/resources\/evalquickref\/\u0022 rel=\u0022nofollow\u0022\u003Etesting with comprehensive tools and real assistive devices\u003C\/a\u003E\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003E.\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022demos\u0022\u003EDemos\u003C\/h2\u003E\n\u003Cp\u003ENote that these show what an \u003Cstrong\u003E\u003Cem\u003Eauthor\u003C\/em\u003E\u003C\/strong\u003E would experience; the Editoria11y checker does not appear for anonymous users on a real site.\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/editoria11y.princeton.edu\/demo\/\u0022 rel=\u0022nofollow\u0022\u003E\u003Cimg width=\u002216\u0022 src=\u0022\/core\/misc\/icons\/e32700\/error.svg\u0022 alt=\u0022Image removed.\u0022 title=\u0022This image has been removed. For security reasons, only images from the local domain are allowed.\u0022 height=\u002216\u0022 class=\u0022filter-image-invalid\u0022\u003E\u003Cbr\u003E\u003Cstrong\u003EInteractive Demo\u003C\/strong\u003E\u003C\/a\u003E\u003Cbr\u003E\u0026nbsp;\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/youtu.be\/dnfQ8G-haXs?feature=shared\u0026amp;t=2250\u0022 rel=\u0022nofollow\u0022\u003E\u003Cimg src=\u0022\/core\/misc\/icons\/e32700\/error.svg\u0022 alt=\u0022Image removed.\u0022 width=\u002216\u0022 title=\u0022This image has been removed. For security reasons, only images from the local domain are allowed.\u0022 height=\u002216\u0022 class=\u0022filter-image-invalid\u0022\u003E\u003Cbr\u003E\u003Cstrong\u003EVideo: authoring interface\u003C\/strong\u003E\u003C\/a\u003E tour \u003Cem\u003E(thanks to \u003Ca href=\u0022https:\/\/www.drupal.org\/u\/the_g_bomb\u0022 rel=\u0022nofollow\u0022\u003EGareth Alexander\u003C\/a\u003E)\u003C\/em\u003E\u003Cbr\u003E\u0026nbsp;\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/youtu.be\/9hev_6L8SPk?feature=shared\u0026amp;t=764\u0022 rel=\u0022nofollow\u0022\u003E\u003Cimg src=\u0022\/core\/misc\/icons\/e32700\/error.svg\u0022 alt=\u0022Image removed.\u0022 width=\u002216\u0022 title=\u0022This image has been removed. For security reasons, only images from the local domain are allowed.\u0022 height=\u002216\u0022 class=\u0022filter-image-invalid\u0022\u003E\u003Cbr\u003E\u003Cstrong\u003EVideo: 2.1.x (previous version) authoring interface\u003C\/strong\u003E\u003C\/a\u003E and \u003Ca href=\u0022https:\/\/youtu.be\/9hev_6L8SPk?feature=shared\u0026amp;t=1109\u0022 rel=\u0022nofollow\u0022\u003E\u003Cstrong\u003Esite reports\u003C\/strong\u003E\u003C\/a\u003E\u003Cbr\u003E\u0026nbsp;\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022the-authoring-experience\u0022\u003EThe authoring experience\u003C\/h2\u003E\n\u003Cp\u003EWhen authenticated users with appropriate roles are viewing pages, Editoria11y\u0027s toggle indicates what was found (no issues, some definite issues found, only some manual checks needed):\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/core\/misc\/icons\/e32700\/error.svg\u0022 alt=\u0022Image removed.\u0022 width=\u002216\u0022 title=\u0022This image has been removed. For security reasons, only images from the local domain are allowed.\u0022 height=\u002216\u0022 class=\u0022filter-image-invalid\u0022\u003E\u003C\/p\u003E\n\u003Cp\u003EWhen the toggle is clicked, alerts are placed on elements with issues, with tooltips that explain the problem and what actions are needed to resolve it. If the item might be a false positive, buttons are available to ignore the alert on this page for the current user or for all users (\u0022Mark as Checked and OK\u0022). By default, these alerts appear automatically the first time new issues are detected:\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/core\/misc\/icons\/e32700\/error.svg\u0022 alt=\u0022Image removed.\u0022 title=\u0022This image has been removed. For security reasons, only images from the local domain are allowed.\u0022 height=\u002216\u0022 width=\u002216\u0022 class=\u0022filter-image-invalid\u0022\u003E\u003C\/p\u003E\n\u003Cp\u003EThe main panel allows authors to step through the issues on the page, restore previously dismissed alerts, and visualize \u003Cstrong\u003E\u003Ca href=\u0022https:\/\/accessibility.princeton.edu\/how\/content\/alternative-text\u0022 rel=\u0022nofollow\u0022\u003Etext alternatives for images on the page\u003C\/a\u003E\u003C\/strong\u003E (\u0022alts\u0022) and the \u003Cstrong\u003E\u003Ca href=\u0022https:\/\/accessibility.princeton.edu\/how\/content\/headings\u0022 rel=\u0022nofollow\u0022\u003Edocument\u0027s heading outline\u003C\/a\u003E\u003C\/strong\u003E.\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/core\/misc\/icons\/e32700\/error.svg\u0022 alt=\u0022Image removed.\u0022 title=\u0022This image has been removed. For security reasons, only images from the local domain are allowed.\u0022 height=\u002216\u0022 width=\u002216\u0022 class=\u0022filter-image-invalid\u0022\u003E\u003C\/p\u003E\n\u003Cp\u003EWhen sync is enabled, all issues detected can be reviewed in the Reports section of the administrative toolbar:\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/core\/misc\/icons\/e32700\/error.svg\u0022 alt=\u0022Image removed.\u0022 title=\u0022This image has been removed. For security reasons, only images from the local domain are allowed.\u0022 height=\u002216\u0022 width=\u002216\u0022 class=\u0022filter-image-invalid\u0022\u003E\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ch3 id=\u0022the-tests\u0022\u003EThe tests\u003C\/h3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Cstrong\u003E\u003Ca href=\u0022https:\/\/accessibility.princeton.edu\/how\/content\/alternative-text\u0022 rel=\u0022nofollow\u0022\u003EText alternatives\u003C\/a\u003E\u003C\/strong\u003E\n\u003Cul\u003E\n\u003Cli\u003EImages with no alt text\u003C\/li\u003E\n\u003Cli\u003EImages with a filename as alt text\u003C\/li\u003E\n\u003Cli\u003EImages with very long alt text\u003C\/li\u003E\n\u003Cli\u003EAlt text that contains redundant text like \u201cimage of\u201d or \u201cphoto of\u201d\u003C\/li\u003E\n\u003Cli\u003EImages in links with alt text that appears to be describing the image instead of the link destination\u003C\/li\u003E\n\u003Cli\u003EEmbedded visualizations that usually require a text alternative\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003E\u003Ca href=\u0022https:\/\/accessibility.princeton.edu\/how\/content\/links\u0022 rel=\u0022nofollow\u0022\u003EMeaningful links\u003C\/a\u003E\u003C\/strong\u003E\n\u003Cul\u003E\n\u003Cli\u003ELinks with no text\u003C\/li\u003E\n\u003Cli\u003ELinks titled with a filename\u003C\/li\u003E\n\u003Cli\u003ELinks only titled with generic text: \u201cclick here,\u201d \u201clearn more,\u201d \u201cdownload,\u201d etc.\u003C\/li\u003E\n\u003Cli\u003ELinks that open in a new window without warning\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\u003Cstrong\u003E\u003Ca href=\u0022https:\/\/accessibility.princeton.edu\/how\/content\/headings\u0022 rel=\u0022nofollow\u0022\u003EDocument outline and structure\u003C\/a\u003E\u003C\/strong\u003E\n\u003Cul\u003E\n\u003Cli\u003ESkipped heading levels\u003C\/li\u003E\n\u003Cli\u003EEmpty headings\u003C\/li\u003E\n\u003Cli\u003EVery long headings\u003C\/li\u003E\n\u003Cli\u003ESuspiciously short blockquotes that may be fake headings\u003C\/li\u003E\n\u003Cli\u003EAll-bold paragraphs with no punctuation that may need heading tags\u003C\/li\u003E\n\u003Cli\u003ESuspicious patterns of paragraph prefixes that may need list tags (e.g. *, \u2022, \u2611\ufe0f, \ud83d\udc49, or incrementing numbers\/letters)\u003C\/li\u003E\n\u003Cli\u003ETables without headers, and overrides for the CKEditor5 table plugin to \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/editoria11y\/issues\/3527991\u0022 rel=\u0022nofollow\u0022\u003Einsert new tables with header rows or columns by default\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003ETables with document headers (\u0022Header 3\u0022) instead of table headers (\u0026lt;th\u0026gt;) \u003C\/li\u003E\n\u003C\/ul\u003E\n\u003C\/li\u003E\n\u003Cli\u003EGeneral quality assurance\n\u003Cul\u003E\n\u003Cli\u003ELARGE QUANTITIES OF CAPS LOCK TEXT\u003C\/li\u003E\n\u003Cli\u003ELinks to PDFs and other documents, reminding the user to test the download for accessibility or provide an alternate, accessible format\u003C\/li\u003E\n\u003Cli\u003EVideo embeds, reminding the user to add closed captions\u003C\/li\u003E\n\u003Cli\u003EAudio embeds, reminding the user to provide a transcript\u003C\/li\u003E\n\u003Cli\u003ESocial media embeds, reminding the user to provide alt elements\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022installation-and-configuration\u0022\u003EInstallation and configuration\u003C\/h2\u003E\n\u003Cp\u003EEditoria11y is included in the Drupal CMS Accessibility Tools recipe available on install.\u003C\/p\u003E\n\u003Cp\u003EIf you prefer to watch: \u003Cstrong\u003E\u003Ca href=\u0022https:\/\/youtu.be\/uYvNYPg38nU?feature=shared\u0026amp;t=579\u0022 rel=\u0022nofollow\u0022\u003E2.x Installation \u0026amp; Configuration Tips Video\u003C\/a\u003E\u003C\/strong\u003E.\u003C\/p\u003E\n\u003Cp\u003EIf you are installing from the command line, do note the \u003Cstrong\u003E\u003Ca href=\u0022https:\/\/www.a11yproject.com\/\u0022 rel=\u0022nofollow\u0022\u003E\u0022eleventy\u0022\u003C\/a\u003E\u003C\/strong\u003E when spelling the module\u0027s name! Those are not L\u0027s.\u003C\/p\u003E\n\u003Cp\u003EEditoria11y\u0027s default configuration (or the Drupal CMS \u0022Accessibility Tools\u0022 recipe) should work decently on most sites, but the following items should be reviewed:\u003C\/p\u003E\n\u003Col\u003E\n\u003Cli\u003E\u003Cstrong\u003E\u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=uYvNYPg38nU\u0026amp;t=718s\u0022 rel=\u0022nofollow\u0022\u003EReview roles and permissions\u003C\/a\u003E\u003C\/strong\u003E. Users must have the \u0022View Editoria11y Checker\u0022 permission to see the checker, and there are \u003Cstrong\u003Eseparate\u003C\/strong\u003E permissions to enable the \u0022ignore\u0022 and \u0022mark OK\u0022 buttons, and to review the site-wide reports. The module attempts to enable the first two by default on roles with common node edit permissions; you should add \u0022mark OK\u0022 to trusted roles and \u0022view dashboard\u0022 as you deem fit.\u003C\/li\u003E\n\u003Cli\u003EClick through key pages and at least one page for each content type on your site, paying special attention to custom views and embeds, to look for theme-level issues or false positives. Fix these issues before rolling the module out, or add selectors to the \u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=uYvNYPg38nU\u0026amp;t=862s\u0022 rel=\u0022nofollow\u0022\u003E\u003Cstrong\u003Emodule configuration\u0027s \u0022skip over these elements\u0022 list\u003C\/strong\u003E\u003C\/a\u003E to suppress repeated alerts (e.g., \u0022#sidebar-menu a, .custom-card-view h3\u0022), or set the checker to only check regions your editors can modify (e.g., \u0022main, #footer-content\u0022). Please do not skip this step! You will prevent frustration for your editors, and viewing the nodes will populate your reporting dashboard.\u003C\/li\u003E\n\u003Cli\u003ESelect a color theme that works well with your site. Light and dark are available in the GUI; custom colors can be injected using JS parameters.\u003C\/li\u003E\n\u003Cli\u003ETell us how it went! This module and its base library are both under active development. Send thoughts through the issue queue or find \u003Ccode\u003Eitmaybejj\u003C\/code\u003E on the Drupal Slack\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003EThere are many additional configuration options available on the module page for more complicated situations: selectors for \u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=uYvNYPg38nU\u0026amp;t=1261s\u0022 rel=\u0022nofollow\u0022\u003Eshadow components to check\u003C\/a\u003E, changes to which document filetypes should be flagged, the ability to \u003Ca href=\u0022https:\/\/youtu.be\/uYvNYPg38nU?feature=shared\u0026amp;t=1454\u0022 rel=\u0022nofollow\u0022\u003Edisable checking if certain selectors are present or absent\u003C\/a\u003E (user does not have an edit button on this content type), etc.\u003C\/p\u003E\n\u003Cp\u003EThe ReadMe also details a method for developers to programmatically modify JS parameters at runtime, which can be used to inject custom defaults on multi-site installs, handle long skip-element lists without cluttering the GUI, modify the color scheme or even rewrite tooltip messages.\u003C\/p\u003E\n\u003Cp\u003EAlso note that the library dispatches JavaScript events at key moments (scan finishes, panel opens, tooltip opens or shuts...), allowing developers to attach custom functionality. JavaScript on sites running Editoria11y can watch for these events to automatically open accordion widgets if they contain hidden alerts, to disable \u0022sticky\u0022 site menus when the panel opens, or even to sync the count and type of alerts found to third-party analytics platforms.\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022see-also\u0022\u003ESee also\u003C\/h2\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai_editoria11y\u0022 rel=\u0022nofollow\u0022\u003E\u003Cstrong\u003EAI: Editoria11y\u003C\/strong\u003E\u003C\/a\u003E adds a \u0022Fix with AI\u0022 button to tool-tips while editing, which displays a dialog with suggestions for revising the content.\u003C\/li\u003E\n\u003Cli\u003ENate Millins\u0027 \u003Cstrong\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/editoria11y_si\u0022 rel=\u0022nofollow\u0022\u003EEditoria11y SI\u003C\/a\u003E\u003C\/strong\u003E connector module uses SiteImprove data to highlight broken links inline.\u003C\/li\u003E\n\u003Cli\u003EThe Editoria11y library is developed in parallel with the \u003Cstrong\u003E\u003Ca href=\u0022https:\/\/sa11y.netlify.app\/\u0022 rel=\u0022nofollow\u0022\u003ESa11y accessibility checker\u003C\/a\u003E\u003C\/strong\u003E, and they have almost identical core test suites. Editoria11y focuses on providing a minimalist GUI and provides additional admin-facing tools like site-wide reporting and dismissal governance; Sa11y provides additional author-facing tools like color checking and readability scoring. There is a \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/sa11y\u0022 rel=\u0022nofollow\u0022\u003E\u003Cstrong\u003EDrupal wrapper for Sa11y\u003C\/strong\u003E\u003C\/a\u003E.\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/decorative_image_widget\u0022 rel=\u0022nofollow\u0022\u003E\u003Cstrong\u003EDecorative Image Widget\u003C\/strong\u003E\u003C\/a\u003E makes alt text required unless the user checks a box to affirm the image is decorative.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003ENote that modules that claim they can \u003Cstrong\u003E\u003Cem\u003Efix\u003C\/em\u003E\u003C\/strong\u003E issues automatically based on AI or the like, or provide untested at-runtime theme modifications, are \u003Ca href=\u0022https:\/\/overlayfactsheet.com\/\u0022 rel=\u0022nofollow\u0022\u003E\u003Cstrong\u003Enot recommended by many disabled Web users\u003C\/strong\u003E\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022advanced-configuration-and-custom-tests\u0022\u003EAdvanced configuration and custom tests\u003C\/h2\u003E\n\u003Cp\u003EThe \u003Ca href=\u0022https:\/\/editoria11y.princeton.edu\/install\/\u0022 rel=\u0022nofollow\u0022\u003E\u003Cstrong\u003Elibrary configuration guide\u003C\/strong\u003E\u003C\/a\u003E has details and examples for parameters not exposed in the GUI, including how to write custom tests and how to open tabs and accordions before highlighting hidden alerts. There is also a \u003Ca href=\u0022https:\/\/youtu.be\/uYvNYPg38nU?feature=shared\u0026amp;t=1648\u0022 rel=\u0022nofollow\u0022\u003E\u003Cstrong\u003Evideo guide to the JS events and test system\u003C\/strong\u003E\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EThe \u003Ca href=\u0022https:\/\/git.drupalcode.org\/project\/editoria11y\/-\/blob\/2.1.x\/README.md#extending-and-modifying-editorially\u0022 rel=\u0022nofollow\u0022\u003E\u003Cstrong\u003Emodule ReadMe has instructions for modifying these parameters\u003C\/strong\u003E\u003C\/a\u003E within a Drupal theme or module.\u003C\/p\u003E\n\u003Cp\u003E\u0026nbsp;\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022project-info\u0022\u003EProject Info\u003C\/h2\u003E\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\u003C\/div\u003E","summary":"Editoria11y is an automatic (not manual!) accessibility checker focused exclusively on flagging issues a content editor can easily fix."},"field_active_installs":"{\u00221.0.x\u0022:26,\u00222.0.x\u0022:87,\u00222.1.x\u0022:804,\u00222.2.x\u0022:19325,\u00223.0.x\u0022:260}","field_active_installs_total":20502,"field_composer_namespace":"drupal\/editoria11y","field_core_semver_maximum":12000000,"field_core_semver_minimum":8000000,"field_issue_summary_template":null,"field_logo_url":{"uri":"https:\/\/git.drupalcode.org\/project\/editoria11y\/-\/avatar","title":null,"options":[]},"field_project_has_releases":true,"field_project_machine_name":"editoria11y","field_security_advisory_coverage":"covered"},"relationships":{"uid":{"data":{"type":"user--user","id":"ebd9c743-897d-4c43-aaf8-b9e1acfe8e26","meta":{"drupal_internal__target_id":1177504}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6f8d5b16-b15d-4f5c-b94c-c00c80210f2d\/uid?resourceVersion=id%3A20051321"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6f8d5b16-b15d-4f5c-b94c-c00c80210f2d\/relationships\/uid?resourceVersion=id%3A20051321"}}},"field_development_status":{"data":{"type":"taxonomy_term--development_status","id":"e767288c-9800-4fb4-aeb8-8c311533838a","meta":{"drupal_internal__target_id":27274}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6f8d5b16-b15d-4f5c-b94c-c00c80210f2d\/field_development_status?resourceVersion=id%3A20051321"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6f8d5b16-b15d-4f5c-b94c-c00c80210f2d\/relationships\/field_development_status?resourceVersion=id%3A20051321"}}},"field_maintenance_status":{"data":{"type":"taxonomy_term--maintenance_status","id":"089406ad-304d-4737-80d1-2f08527ae49e","meta":{"drupal_internal__target_id":27271}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6f8d5b16-b15d-4f5c-b94c-c00c80210f2d\/field_maintenance_status?resourceVersion=id%3A20051321"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6f8d5b16-b15d-4f5c-b94c-c00c80210f2d\/relationships\/field_maintenance_status?resourceVersion=id%3A20051321"}}},"field_module_categories":{"data":[{"type":"taxonomy_term--module_categories","id":"3df293b3-c9a1-4232-962b-3c8169e8e6e3","meta":{"drupal_internal__target_id":203}},{"type":"taxonomy_term--module_categories","id":"86237004-3801-40cf-96b5-fe7d60efccb5","meta":{"drupal_internal__target_id":187}},{"type":"taxonomy_term--module_categories","id":"01df2105-2397-4a0e-b34c-80da1c3b1208","meta":{"drupal_internal__target_id":201}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6f8d5b16-b15d-4f5c-b94c-c00c80210f2d\/field_module_categories?resourceVersion=id%3A20051321"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6f8d5b16-b15d-4f5c-b94c-c00c80210f2d\/relationships\/field_module_categories?resourceVersion=id%3A20051321"}}},"field_project_images":{"data":[{"type":"file--file","id":"missing","meta":{"links":{"help":{"href":"https:\/\/www.drupal.org\/docs\/8\/modules\/json-api\/core-concepts#missing","meta":{"about":"Usage and meaning of the \u0027missing\u0027 resource identifier."}}}}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6f8d5b16-b15d-4f5c-b94c-c00c80210f2d\/field_project_images?resourceVersion=id%3A20051321"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6f8d5b16-b15d-4f5c-b94c-c00c80210f2d\/relationships\/field_project_images?resourceVersion=id%3A20051321"}}}}},{"type":"node--project_module","id":"9ea06ebb-d5e9-46cb-b5a1-c7db73cf2283","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9ea06ebb-d5e9-46cb-b5a1-c7db73cf2283?resourceVersion=id%3A20044590"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9ea06ebb-d5e9-46cb-b5a1-c7db73cf2283?resourceVersion=rel%3Aworking-copy"}},"attributes":{"drupal_internal__nid":2951108,"status":true,"title":"View Password","created":"2018-03-08T10:32:25+00:00","changed":"2026-04-07T05:20:02+00:00","moderation_state":null,"body":{"value":"This is a lightweight, user-friendly module that allows a user to toggle between showing or hiding the entered password before submitting the form. \r\n\r\nThis module does not in any way display existing encrypted passwords from the database, but merely allows the user to display the entered password before submission as plain text via JavaScript.\r\n\r\n\u003Ch2\u003EFunctionality\u003C\/h2\u003E\r\nWhen installed, an icon of a crossed eye is added next to the password field on the log in form. \r\nBy toggling on the eye icon the password will be displayed or hidden.\r\n\r\n\r\n\u003Ch2\u003EConfiguration\u003C\/h2\u003E\r\nTo enable this feature for any form, it needs to be configured on the configuration page of the module. This configuration can then be exported\/imported.\r\n\r\n\r\n\u003Cstrong\u003E#D8AX - I \u003Ca href=\u0022http:\/\/groups.drupal.org\/node\/66323\u0022\u003Epledge\u003C\/a\u003E to make this module as \u003Ca href=\u0022http:\/\/drupal.org\/node\/394094\u0022\u003Eaccessible as it can be\u003C\/a\u003E. If you find any flaws, please \u003Ca href=\u0022\/project\/issues\/view_password\u0022\u003Esubmit an issue\u003C\/a\u003E. Help me fix them if you can.\u003C\/strong\u003E\r\n\r\n\r\nThe 6.0.x branch is also Drupal 9\/10 compatible, and new features are being added. \r\n","format":"1","processed":"\u003Cdiv class=\u0022toc-filter\u0022\u003E\u003Cp\u003EThis is a lightweight, user-friendly module that allows a user to toggle between showing or hiding the entered password before submitting the form. \u003C\/p\u003E\n\u003Cp\u003EThis module does not in any way display existing encrypted passwords from the database, but merely allows the user to display the entered password before submission as plain text via JavaScript.\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022functionality\u0022\u003EFunctionality\u003C\/h2\u003E\n\u003Cp\u003EWhen installed, an icon of a crossed eye is added next to the password field on the log in form.\u003Cbr\u003E\nBy toggling on the eye icon the password will be displayed or hidden.\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022configuration\u0022\u003EConfiguration\u003C\/h2\u003E\n\u003Cp\u003ETo enable this feature for any form, it needs to be configured on the configuration page of the module. This configuration can then be exported\/imported.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003E#D8AX - I \u003Ca href=\u0022http:\/\/groups.drupal.org\/node\/66323\u0022 rel=\u0022nofollow\u0022\u003Epledge\u003C\/a\u003E to make this module as \u003Ca href=\u0022http:\/\/drupal.org\/node\/394094\u0022 rel=\u0022nofollow\u0022\u003Eaccessible as it can be\u003C\/a\u003E. If you find any flaws, please \u003Ca href=\u0022\/project\/issues\/view_password\u0022 rel=\u0022nofollow\u0022\u003Esubmit an issue\u003C\/a\u003E. Help me fix them if you can.\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003EThe 6.0.x branch is also Drupal 9\/10 compatible, and new features are being added. \u003C\/p\u003E\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\u003C\/div\u003E","summary":"Allows the site users to validate their password input before the submission of the form. \r\nDoes this by exposing the password content when clicking on the icon of an \u003Cem\u003Eeye\u003C\/em\u003E next to password input field before submission of the form. \r\n\r\nSite builders can choose in which form to apply the functionality by accessing the configuration page of the module."},"field_active_installs":"{\u00228.x-4.x\u0022:1,\u00228.x-5.x\u0022:25,\u00226.0.x\u0022:13474}","field_active_installs_total":13500,"field_composer_namespace":"drupal\/view_password","field_core_semver_maximum":12000000,"field_core_semver_minimum":8000000,"field_issue_summary_template":null,"field_logo_url":null,"field_project_has_releases":true,"field_project_machine_name":"view_password","field_security_advisory_coverage":"covered"},"relationships":{"uid":{"data":{"type":"user--user","id":"e8a182f9-9f1d-4273-9720-93a6d64fc697","meta":{"drupal_internal__target_id":3494063}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9ea06ebb-d5e9-46cb-b5a1-c7db73cf2283\/uid?resourceVersion=id%3A20044590"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9ea06ebb-d5e9-46cb-b5a1-c7db73cf2283\/relationships\/uid?resourceVersion=id%3A20044590"}}},"field_development_status":{"data":{"type":"taxonomy_term--development_status","id":"e767288c-9800-4fb4-aeb8-8c311533838a","meta":{"drupal_internal__target_id":27274}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9ea06ebb-d5e9-46cb-b5a1-c7db73cf2283\/field_development_status?resourceVersion=id%3A20044590"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9ea06ebb-d5e9-46cb-b5a1-c7db73cf2283\/relationships\/field_development_status?resourceVersion=id%3A20044590"}}},"field_maintenance_status":{"data":{"type":"taxonomy_term--maintenance_status","id":"089406ad-304d-4737-80d1-2f08527ae49e","meta":{"drupal_internal__target_id":27271}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9ea06ebb-d5e9-46cb-b5a1-c7db73cf2283\/field_maintenance_status?resourceVersion=id%3A20044590"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9ea06ebb-d5e9-46cb-b5a1-c7db73cf2283\/relationships\/field_maintenance_status?resourceVersion=id%3A20044590"}}},"field_module_categories":{"data":[{"type":"taxonomy_term--module_categories","id":"3df293b3-c9a1-4232-962b-3c8169e8e6e3","meta":{"drupal_internal__target_id":203}},{"type":"taxonomy_term--module_categories","id":"086cebcf-200f-4c34-886e-f9921919b292","meta":{"drupal_internal__target_id":189}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9ea06ebb-d5e9-46cb-b5a1-c7db73cf2283\/field_module_categories?resourceVersion=id%3A20044590"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9ea06ebb-d5e9-46cb-b5a1-c7db73cf2283\/relationships\/field_module_categories?resourceVersion=id%3A20044590"}}},"field_project_images":{"data":[{"type":"file--file","id":"03315b7d-1050-4e55-9447-0ea166a500c3","meta":{"alt":"The module adds the crossed eye icon when the password is not shown","title":null,"width":490,"height":317,"drupal_internal__target_id":30201}},{"type":"file--file","id":"b713ecbe-9331-4ac5-a08e-2c31f5cb255b","meta":{"alt":"When clicked, the eye opens and the password is visible","title":null,"width":483,"height":321,"drupal_internal__target_id":30202}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9ea06ebb-d5e9-46cb-b5a1-c7db73cf2283\/field_project_images?resourceVersion=id%3A20044590"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9ea06ebb-d5e9-46cb-b5a1-c7db73cf2283\/relationships\/field_project_images?resourceVersion=id%3A20044590"}}}}},{"type":"node--project_module","id":"6eeac486-e095-4704-bd36-06a48c72a965","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6eeac486-e095-4704-bd36-06a48c72a965?resourceVersion=id%3A20054552"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6eeac486-e095-4704-bd36-06a48c72a965?resourceVersion=rel%3Aworking-copy"}},"attributes":{"drupal_internal__nid":3326993,"status":true,"title":"Tour","created":"2022-12-13T23:19:03+00:00","changed":"2026-04-07T05:20:02+00:00","moderation_state":null,"body":{"value":"The Tour module provides users with guided tours of the site interface. Each tour consists of several tips that highlight elements of the user interface, guide the user through a workflow, or explain key concepts of the website.\r\n\r\n\u003Cimg src=\u0022https:\/\/www.drupal.org\/files\/Screenshot%202024-08-31%20at%2012.27.29%E2%80%AFPM.png\u0022 alt=\u0022example\u0022 \/\u003E\r\n\r\n\u003Ch2\u003EImprovements from core\u003C\/h2\u003E\r\n\u003Cul\u003E\r\n  \u003Cli\u003EIntegrated the Tour UI module to provide a visual interface for creating new and editing existing tours\u003C\/li\u003E\r\n  \u003Cli\u003EAlmost 4 times as many default Tours\u003C\/li\u003E\r\n  \u003Cli\u003EImproved accessibility\u003C\/li\u003E\r\n  \u003Cli\u003ESettings form to control the label of the button for starting a tour\u003C\/li\u003E\r\n  \u003Cli\u003EThe button block for starting a tour to allow to run tours without the toolbar\u003C\/li\u003E\r\n\u003C\/ul\u003E\r\n\r\n\u003Cstrong\u003EDisclaimer: Due to Tours being config and possible to be edited on a site basis we will not be doing any Tour or Tip updates retroactively.\u003C\/strong\u003E\r\n\r\n\u003Ch2\u003EExtension modules\u003C\/h2\u003E\r\n\r\n\u003Cul\u003E\r\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/tour_extras\u0022\u003ETour Extras\u003C\/a\u003E\u003C\/li\u003E\r\n\u003C\/ul\u003E\r\n\r\n\u003Ch2\u003EConfig moved to recipes!\u003C\/h2\u003E\r\n\r\n\u003Cul\u003E\r\n  \u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/tour_core\u0022\u003ETour Core\u003C\/a\u003E\u003C\/li\u003E\r\n  \u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/tour_core_language\u0022\u003ETour Core Language\u003C\/a\u003E\u003C\/li\u003E\r\n\u003C\/ul\u003E\r\n\r\n\u003Ch2\u003ERequirements\u003C\/h2\u003E\r\nSince Tour was removed from core a copy of \u003Ca href=\u0022https:\/\/github.com\/shepherd-pro\/shepherd\u0022\u003EshepherdJs\u003C\/a\u003E was copied to the module.\r\n","format":"1","processed":"\u003Cdiv class=\u0022toc-filter\u0022\u003E\u003Cp\u003EThe Tour module provides users with guided tours of the site interface. Each tour consists of several tips that highlight elements of the user interface, guide the user through a workflow, or explain key concepts of the website.\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/core\/misc\/icons\/e32700\/error.svg\u0022 alt=\u0022Image removed.\u0022 title=\u0022This image has been removed. For security reasons, only images from the local domain are allowed.\u0022 height=\u002216\u0022 width=\u002216\u0022 class=\u0022filter-image-invalid\u0022\u003E\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022improvements-from-core\u0022\u003EImprovements from core\u003C\/h2\u003E\n\u003Cul\u003E\n\u003Cli\u003EIntegrated the Tour UI module to provide a visual interface for creating new and editing existing tours\u003C\/li\u003E\n\u003Cli\u003EAlmost 4 times as many default Tours\u003C\/li\u003E\n\u003Cli\u003EImproved accessibility\u003C\/li\u003E\n\u003Cli\u003ESettings form to control the label of the button for starting a tour\u003C\/li\u003E\n\u003Cli\u003EThe button block for starting a tour to allow to run tours without the toolbar\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003E\u003Cstrong\u003EDisclaimer: Due to Tours being config and possible to be edited on a site basis we will not be doing any Tour or Tip updates retroactively.\u003C\/strong\u003E\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022extension-modules\u0022\u003EExtension modules\u003C\/h2\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/tour_extras\u0022 rel=\u0022nofollow\u0022\u003ETour Extras\u003C\/a\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022config-moved-to-recipes\u0022\u003EConfig moved to recipes!\u003C\/h2\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/tour_core\u0022 rel=\u0022nofollow\u0022\u003ETour Core\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/tour_core_language\u0022 rel=\u0022nofollow\u0022\u003ETour Core Language\u003C\/a\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022requirements\u0022\u003ERequirements\u003C\/h2\u003E\n\u003Cp\u003ESince Tour was removed from core a copy of \u003Ca href=\u0022https:\/\/github.com\/shepherd-pro\/shepherd\u0022 rel=\u0022nofollow\u0022\u003EshepherdJs\u003C\/a\u003E was copied to the module.\u003C\/p\u003E\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\u003C\/div\u003E","summary":""},"field_active_installs":"{\u00221.0.x\u0022:254,\u00222.0.x\u0022:9419}","field_active_installs_total":9673,"field_composer_namespace":"drupal\/tour","field_core_semver_maximum":12999999,"field_core_semver_minimum":10000000,"field_issue_summary_template":null,"field_logo_url":null,"field_project_has_releases":true,"field_project_machine_name":"tour","field_security_advisory_coverage":"covered"},"relationships":{"uid":{"data":{"type":"user--user","id":"f2e2ea48-c23d-401f-a3c2-a7b2985bb613","meta":{"drupal_internal__target_id":3252890}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6eeac486-e095-4704-bd36-06a48c72a965\/uid?resourceVersion=id%3A20054552"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6eeac486-e095-4704-bd36-06a48c72a965\/relationships\/uid?resourceVersion=id%3A20054552"}}},"field_development_status":{"data":{"type":"taxonomy_term--development_status","id":"e767288c-9800-4fb4-aeb8-8c311533838a","meta":{"drupal_internal__target_id":27274}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6eeac486-e095-4704-bd36-06a48c72a965\/field_development_status?resourceVersion=id%3A20054552"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6eeac486-e095-4704-bd36-06a48c72a965\/relationships\/field_development_status?resourceVersion=id%3A20054552"}}},"field_maintenance_status":{"data":{"type":"taxonomy_term--maintenance_status","id":"089406ad-304d-4737-80d1-2f08527ae49e","meta":{"drupal_internal__target_id":27271}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6eeac486-e095-4704-bd36-06a48c72a965\/field_maintenance_status?resourceVersion=id%3A20054552"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6eeac486-e095-4704-bd36-06a48c72a965\/relationships\/field_maintenance_status?resourceVersion=id%3A20054552"}}},"field_module_categories":{"data":[{"type":"taxonomy_term--module_categories","id":"3df293b3-c9a1-4232-962b-3c8169e8e6e3","meta":{"drupal_internal__target_id":203}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6eeac486-e095-4704-bd36-06a48c72a965\/field_module_categories?resourceVersion=id%3A20054552"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6eeac486-e095-4704-bd36-06a48c72a965\/relationships\/field_module_categories?resourceVersion=id%3A20054552"}}},"field_project_images":{"data":[],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6eeac486-e095-4704-bd36-06a48c72a965\/field_project_images?resourceVersion=id%3A20054552"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6eeac486-e095-4704-bd36-06a48c72a965\/relationships\/field_project_images?resourceVersion=id%3A20054552"}}}}},{"type":"node--project_module","id":"0e3556a8-6a8a-4675-861c-e4ed9accd0ee","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/0e3556a8-6a8a-4675-861c-e4ed9accd0ee?resourceVersion=id%3A20057380"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/0e3556a8-6a8a-4675-861c-e4ed9accd0ee?resourceVersion=rel%3Aworking-copy"}},"attributes":{"drupal_internal__nid":3468983,"status":true,"title":"AI Image Alt Text","created":"2024-08-19T15:39:18+00:00","changed":"2026-04-07T05:20:02+00:00","moderation_state":null,"body":{"value":"\u003Cp\u003EThis module is part of the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai\u0022\u003EAI module\u003C\/a\u003E ecosystem and included in \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/dxpr_cms\u0022\u003EDXPR CMS\u003C\/a\u003E.\u003C\/p\u003E\r\n\r\n\u003Cblockquote\u003EGenerate accurate, descriptive alt text automatically using AI vision models. Improve accessibility and search rankings while maintaining editorial control through human-in-the-loop verification.\u003C\/blockquote\u003E\r\n\r\n\u003Cimg src=\u0022\/files\/project-images\/ai_alt_image_text.png\u0022 alt=\u0022AI Alt Image Text\u0022 \/\u003E\r\n\r\n\u003Ch3\u003EYou need AI Image Alt Text if\u003C\/h3\u003E\r\n\u003Cul\u003E\r\n  \u003Cli\u003EYou manage sites with hundreds or thousands of images lacking alt text\u003C\/li\u003E\r\n  \u003Cli\u003EYou need to improve accessibility compliance and SEO rankings\u003C\/li\u003E\r\n  \u003Cli\u003EYour content team struggles to write consistent, descriptive alt text\u003C\/li\u003E\r\n  \u003Cli\u003EYou want to speed up content publishing while maintaining quality\u003C\/li\u003E\r\n\u003C\/ul\u003E\r\n\r\n\u003Ch3 id=\u0022module-project--features\u0022\u003EFeatures\u003C\/h3\u003E\r\n  \u003Cp\u003E\r\n    The AI Image Alt Text module allows you to generate alt texts for image fields using AI vision models. As it is widget-based, it incorporates a human-in-the-loop process, enabling manual generation and verification of the alt text before saving.\r\n  \u003C\/p\u003E\r\n  \u003Cp\u003E\r\n    Additionally, the module utilizes the entity\u2019s language (when available) to generate alt texts in the corresponding language.\r\n  \u003C\/p\u003E\r\n\r\n  \u003Ch3 id=\u0022module-project--seo\u0022\u003ESEO benefits\u003C\/h3\u003E\r\n  \u003Cp\u003E\r\n    Generating accurate and descriptive alt texts enhances your website\u0027s accessibility and improves search engine optimization (SEO). Alt texts help search engines understand image content, which can improve your site\u0027s ranking in image search results. By using this module, you ensure high-quality, consistent alt text generation that adheres to best practices for both accessibility and SEO.\r\n  \u003C\/p\u003E\r\n\r\n  \u003Ch3 id=\u0022module-project--post-installation\u0022\u003EPost-installation\u003C\/h3\u003E\r\n  \u003Col\u003E\r\n    \u003Cli\u003ESet up permissions to determine which roles can generate alt texts using AI.\u003C\/li\u003E\r\n    \u003Cli\u003E\r\n      Access the settings page at \/admin\/config\/ai\/ai_image_alt_text to customize the prompt or adjust how the image is preprocessed before being sent to the AI.\r\n    \u003C\/li\u003E\r\n    \u003Cli\u003EA button will then appear on image fields for generating alt texts.\u003C\/li\u003E\r\n  \u003C\/ol\u003E\r\n\r\n  \u003Cdiv class=\u0022note-tip\u0022\u003E\r\n    \u003Ch4\u003EPrefer a turnkey demo site?\u003C\/h4\u003E\r\n    \u003Cp\u003ESpin up \u003Cstrong\u003EDXPR CMS\u003C\/strong\u003E\u2014Drupal pre-configured with DXPR Builder, DXPR Theme, AI Image Alt Text module, and security best practices.\u003C\/p\u003E\r\n    \u003Cp\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/dxpr_cms\u0022 title=\u0022DXPR CMS platform\u0022\u003EGet DXPR CMS \u00bb\u003C\/a\u003E\u003C\/p\u003E\r\n  \u003C\/div\u003E\r\n\r\n  \u003Ch3 id=\u0022module-project--additional-requirements\u0022\u003EAdditional requirements\u003C\/h3\u003E\r\n  \u003Cp\u003E\r\n    This module uses the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai\u0022\u003EAI module\u003C\/a\u003E as its foundation. It supports any vision model available through providers like OpenAI, Anthropic, and Fireworks AI.\r\n  \u003C\/p\u003E\r\n\r\n  \u003Ch3 id=\u0022module-project--similar-projects\u0022\u003ESimilar projects\u003C\/h3\u003E\r\n  \u003Cp\u003E\r\n    The \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/auto_alter\u0022\u003EAutomatic Alternative Text\u003C\/a\u003E module offers similar functionality by leveraging Azure Computer Vision to generate alt texts when an entity is saved.\r\n  \u003C\/p\u003E","format":"1","processed":"\u003Cdiv class=\u0022toc-filter\u0022\u003E\u003Cp\u003EThis module is part of the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai\u0022 rel=\u0022nofollow\u0022\u003EAI module\u003C\/a\u003E ecosystem and included in \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/dxpr_cms\u0022 rel=\u0022nofollow\u0022\u003EDXPR CMS\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cblockquote\u003E\u003Cp\u003EGenerate accurate, descriptive alt text automatically using AI vision models. Improve accessibility and search rankings while maintaining editorial control through human-in-the-loop verification.\u003C\/p\u003E\u003C\/blockquote\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/files\/project-images\/ai_alt_image_text.png\u0022 alt=\u0022AI Alt Image Text\u0022\u003E\u003C\/p\u003E\n\u003Ch3 id=\u0022you-need-ai-image-alt-text-if\u0022\u003EYou need AI Image Alt Text if\u003C\/h3\u003E\n\u003Cul\u003E\n\u003Cli\u003EYou manage sites with hundreds or thousands of images lacking alt text\u003C\/li\u003E\n\u003Cli\u003EYou need to improve accessibility compliance and SEO rankings\u003C\/li\u003E\n\u003Cli\u003EYour content team struggles to write consistent, descriptive alt text\u003C\/li\u003E\n\u003Cli\u003EYou want to speed up content publishing while maintaining quality\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3 id=\u0022module-project--features-01\u0022\u003EFeatures\u003C\/h3\u003E\n\u003Cp\u003E\n    The AI Image Alt Text module allows you to generate alt texts for image fields using AI vision models. As it is widget-based, it incorporates a human-in-the-loop process, enabling manual generation and verification of the alt text before saving.\n  \u003C\/p\u003E\n\u003Cp\u003E\n    Additionally, the module utilizes the entity\u2019s language (when available) to generate alt texts in the corresponding language.\n  \u003C\/p\u003E\n\u003Ch3 id=\u0022module-project--seo-01\u0022\u003ESEO benefits\u003C\/h3\u003E\n\u003Cp\u003E\n    Generating accurate and descriptive alt texts enhances your website\u0027s accessibility and improves search engine optimization (SEO). Alt texts help search engines understand image content, which can improve your site\u0027s ranking in image search results. By using this module, you ensure high-quality, consistent alt text generation that adheres to best practices for both accessibility and SEO.\n  \u003C\/p\u003E\n\u003Ch3 id=\u0022module-project--post-installation-01\u0022\u003EPost-installation\u003C\/h3\u003E\n\u003Col\u003E\n\u003Cli\u003ESet up permissions to determine which roles can generate alt texts using AI.\u003C\/li\u003E\n\u003Cli\u003E\n      Access the settings page at \/admin\/config\/ai\/ai_image_alt_text to customize the prompt or adjust how the image is preprocessed before being sent to the AI.\n    \u003C\/li\u003E\n\u003Cli\u003EA button will then appear on image fields for generating alt texts.\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cdiv class=\u0022note-tip\u0022\u003E\n\u003Ch4 id=\u0022prefer-a-turnkey-demo-site\u0022\u003EPrefer a turnkey demo site?\u003C\/h4\u003E\n\u003Cp\u003ESpin up \u003Cstrong\u003EDXPR CMS\u003C\/strong\u003E\u2014Drupal pre-configured with DXPR Builder, DXPR Theme, AI Image Alt Text module, and security best practices.\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/project\/dxpr_cms\u0022 rel=\u0022nofollow\u0022\u003EGet DXPR CMS \u00bb\u003C\/a\u003E\u003C\/p\u003E\n\u003C\/div\u003E\n\u003Ch3 id=\u0022module-project--additional-requirements-01\u0022\u003EAdditional requirements\u003C\/h3\u003E\n\u003Cp\u003E\n    This module uses the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/ai\u0022 rel=\u0022nofollow\u0022\u003EAI module\u003C\/a\u003E as its foundation. It supports any vision model available through providers like OpenAI, Anthropic, and Fireworks AI.\n  \u003C\/p\u003E\n\u003Ch3 id=\u0022module-project--similar-projects-01\u0022\u003ESimilar projects\u003C\/h3\u003E\n\u003Cp\u003E\n    The \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/auto_alter\u0022 rel=\u0022nofollow\u0022\u003EAutomatic Alternative Text\u003C\/a\u003E module offers similar functionality by leveraging Azure Computer Vision to generate alt texts when an entity is saved.\n  \u003C\/p\u003E\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\u003C\/div\u003E","summary":""},"field_active_installs":"{\u00221.0.x\u0022:6842}","field_active_installs_total":6842,"field_composer_namespace":"drupal\/ai_image_alt_text","field_core_semver_maximum":12000000,"field_core_semver_minimum":10002000,"field_issue_summary_template":null,"field_logo_url":null,"field_project_has_releases":true,"field_project_machine_name":"ai_image_alt_text","field_security_advisory_coverage":"covered"},"relationships":{"uid":{"data":{"type":"user--user","id":"33d5f6fe-142c-475b-abf6-656b0c581540","meta":{"drupal_internal__target_id":385947}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/0e3556a8-6a8a-4675-861c-e4ed9accd0ee\/uid?resourceVersion=id%3A20057380"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/0e3556a8-6a8a-4675-861c-e4ed9accd0ee\/relationships\/uid?resourceVersion=id%3A20057380"}}},"field_development_status":{"data":{"type":"taxonomy_term--development_status","id":"e767288c-9800-4fb4-aeb8-8c311533838a","meta":{"drupal_internal__target_id":27274}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/0e3556a8-6a8a-4675-861c-e4ed9accd0ee\/field_development_status?resourceVersion=id%3A20057380"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/0e3556a8-6a8a-4675-861c-e4ed9accd0ee\/relationships\/field_development_status?resourceVersion=id%3A20057380"}}},"field_maintenance_status":{"data":{"type":"taxonomy_term--maintenance_status","id":"089406ad-304d-4737-80d1-2f08527ae49e","meta":{"drupal_internal__target_id":27271}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/0e3556a8-6a8a-4675-861c-e4ed9accd0ee\/field_maintenance_status?resourceVersion=id%3A20057380"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/0e3556a8-6a8a-4675-861c-e4ed9accd0ee\/relationships\/field_maintenance_status?resourceVersion=id%3A20057380"}}},"field_module_categories":{"data":[{"type":"taxonomy_term--module_categories","id":"3df293b3-c9a1-4232-962b-3c8169e8e6e3","meta":{"drupal_internal__target_id":203}},{"type":"taxonomy_term--module_categories","id":"68428c33-1db7-438d-b1b3-e23004e0982b","meta":{"drupal_internal__target_id":192}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/0e3556a8-6a8a-4675-861c-e4ed9accd0ee\/field_module_categories?resourceVersion=id%3A20057380"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/0e3556a8-6a8a-4675-861c-e4ed9accd0ee\/relationships\/field_module_categories?resourceVersion=id%3A20057380"}}},"field_project_images":{"data":[{"type":"file--file","id":"98f55b60-1b67-411a-bdcf-761c654d3b91","meta":{"alt":"","title":null,"width":654,"height":219,"drupal_internal__target_id":37823}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/0e3556a8-6a8a-4675-861c-e4ed9accd0ee\/field_project_images?resourceVersion=id%3A20057380"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/0e3556a8-6a8a-4675-861c-e4ed9accd0ee\/relationships\/field_project_images?resourceVersion=id%3A20057380"}}}}},{"type":"node--project_module","id":"e21ac647-51a7-4e1e-92f5-2d70db7ff3bb","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/e21ac647-51a7-4e1e-92f5-2d70db7ff3bb?resourceVersion=id%3A20040927"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/e21ac647-51a7-4e1e-92f5-2d70db7ff3bb?resourceVersion=rel%3Aworking-copy"}},"attributes":{"drupal_internal__nid":2846758,"status":true,"title":"Siteimprove.ai","created":"2017-01-25T17:07:59+00:00","changed":"2026-04-07T05:20:02+00:00","moderation_state":null,"body":{"value":"\u003Ch2\u003EDrupal 10\u003C\/h2\u003E\r\nThe new 2.0.x major version supports Drupal 9.2+ and Drupal 10. Deprecated JavaScript libraries has been replaced by their succeeders. \r\n\r\n\u003Ch2\u003ESiteimprove.ai Plugins \u2013 Your Insights Always Within Reach\u003C\/h2\u003E\r\n\r\nThe Siteimprove.ai plugin bridges the gap between Drupal and the Siteimprove.ai Intelligence Platform.\r\nThanks to the seamless integration, you are now able to put your Siteimprove.ai results to use where they are most valuable \u2013 during your content creation and editing process.\r\n\r\nWith analytics and content insights always at hand, contributors can test, fix, and optimize their work continuously. Once the detected issues have been assessed, you can directly re-check the relevant page when it is published and see if further actions are needed.\r\nDelivering a superior digital experience has never been more efficient and convenient. \r\n\r\n\u003Ch2\u003ESiteimprove.ai Analytics\u003C\/h2\u003E\r\nEnabling Siteimprove.ai Analytics to a Drupal site is out of scope of this module. Refer to Siteimprove.ai\u0027s documentation for \u003Ca href=\u0022https:\/\/help.siteimprove.com\/support\/solutions\/articles\/80000448448-addi\u0022\u003Eadding Siteimprove Analytics Javascript to a website\u003C\/a\u003E or install the Drupal module \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/siteimprove_analytics\u0022\u003ESiteimprove.ai Analytics\u003C\/a\u003E.\r\n\r\n\u003Ch2\u003EAbout Siteimprove.ai\u003C\/h2\u003E\r\nSiteimprove.ai offers the world\u0027s most comprehensive cloud-based Digital Presence Optimization (DPO) software. The Siteimprove.ai Intelligence Platform provides eye-opening insights that empower you and your team to create higher quality content, drive better traffic, measure digital performance, and work towards regulatory compliance\u2014all from one place. Siteimprove.ai is also proud to offer best-in-class technical support, academy courses, services, and technology integrations.\r\n\r\nFind out why more than 7,000 organizations around the world practice DPO using the Siteimprove Intelligence Platform at \u003Ca href=\u0022https:\/\/siteimprove.com\/en\/\u0022\u003Esiteimprove.com\u003C\/a\u003E\r\n\r\n\r\n\u003Cstrong\u003EInstallation guide\u003C\/strong\u003E\r\nSiteimprove.ai Plugin can be installed like any other Drupal module. \r\nPlace it in the modules directory for your site and enable it on the \u0027admin\/modules\u0027 page.\r\nBy default the plugin is only available for administrators. If you want to allow other roles to use the plugin, go to your permissions page and enable it on the option \u201cAccess Siteimprove.ai Plugin\u201d (under the group \u201cSiteimprove.ai Plugin\u201d).\r\n\r\n\u003Cstrong\u003EFrontend Domain Plugin\u003C\/strong\u003E\r\n\r\nIf a Drupal site has a domain for the frontend site that is different from the\r\nbackend domain, this can be configured with existing plugins, or you can make\r\nyour own.\r\n\r\nIncluded with the module are two plugins for (1) the default case where the\r\nfrontend domain is the same as the backend domain, and (2) the frontend domain\r\nis a single domain and doesn\u0027t need advanced configuration.\r\n\r\nIf you need Domain Access support, you can install the module\r\nsiteimprove_domain_access. This module doesn\u0027t need to be configured, just\r\nenable it and it will make sure Siteimprove.ai is notified with the correct\r\nurl(s) for a given entity.\r\n\r\n\u003Cstrong\u003EAdding your own plugin\u003C\/strong\u003E\r\n\r\nUse the annotation discovery method with the annotation \u0027@SiteimproveDomain\u0027.\r\nThis annotation has the variables \u0027id\u0027, \u0027label\u0027 (translatable), and\r\n\u0027description\u0027 (translatable). See the plugin Simple\r\n(src\/Plugin\/SiteimproveDomain\/Simple.php) for a plugin with no additional\r\nconfiguration, and the plugin Single (src\/Plugin\/SiteimproveDomain\/Single.php)\r\nfor a plugin with configuration.\r\n\r\nThe plugin uses the ConfigFormBase trait, so if you want to save configuration\r\nfor your plugin, you have to add the function \u0027getEditableConfigNames()\u0027, that\r\nshould return a list of setting names. You can see the Single plugin for how to\r\nsave configuration in the \u0027submitForm()\u0027 function, or - if you need a more\r\nadvanced example - see the module siteimprove_domain_access.\r\n\r\nThe following methods are required in a custom plugin: \u0027buildForm()\u0027 (will be\r\ndisplayed on the Siteimprove.ai settings page) and \u0027getUrls()\u0027 (returns the urls\r\nfor the current entity including http scheme \u0022http:\/\/\u0022 or \u0022https:\/\/\u0022).\r\n\r\nThe following methods are optional: \u0027validateForm()\u0027 (validates the form, if\r\nyour plugin requires configuration), \u0027submitForm()\u0027 (saves any changes to the\r\nplugin\u0027s configuration), \u0027getEditableConfigNames()\u0027 (returns a list of setting\r\nnames).","format":"1","processed":"\u003Cdiv class=\u0022toc-filter\u0022\u003E\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022drupal-10\u0022\u003EDrupal 10\u003C\/h2\u003E\n\u003Cp\u003EThe new 2.0.x major version supports Drupal 9.2+ and Drupal 10. Deprecated JavaScript libraries has been replaced by their succeeders. \u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022siteimprove-ai-plugins-your-insights-always-within-reach\u0022\u003ESiteimprove.ai Plugins \u2013 Your Insights Always Within Reach\u003C\/h2\u003E\n\u003Cp\u003EThe Siteimprove.ai plugin bridges the gap between Drupal and the Siteimprove.ai Intelligence Platform.\u003Cbr\u003E\nThanks to the seamless integration, you are now able to put your Siteimprove.ai results to use where they are most valuable \u2013 during your content creation and editing process.\u003C\/p\u003E\n\u003Cp\u003EWith analytics and content insights always at hand, contributors can test, fix, and optimize their work continuously. Once the detected issues have been assessed, you can directly re-check the relevant page when it is published and see if further actions are needed.\u003Cbr\u003E\nDelivering a superior digital experience has never been more efficient and convenient. \u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022siteimprove-ai-analytics\u0022\u003ESiteimprove.ai Analytics\u003C\/h2\u003E\n\u003Cp\u003EEnabling Siteimprove.ai Analytics to a Drupal site is out of scope of this module. Refer to Siteimprove.ai\u0027s documentation for \u003Ca href=\u0022https:\/\/help.siteimprove.com\/support\/solutions\/articles\/80000448448-addi\u0022 rel=\u0022nofollow\u0022\u003Eadding Siteimprove Analytics Javascript to a website\u003C\/a\u003E or install the Drupal module \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/siteimprove_analytics\u0022 rel=\u0022nofollow\u0022\u003ESiteimprove.ai Analytics\u003C\/a\u003E.\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022about-siteimprove-ai\u0022\u003EAbout Siteimprove.ai\u003C\/h2\u003E\n\u003Cp\u003ESiteimprove.ai offers the world\u0027s most comprehensive cloud-based Digital Presence Optimization (DPO) software. The Siteimprove.ai Intelligence Platform provides eye-opening insights that empower you and your team to create higher quality content, drive better traffic, measure digital performance, and work towards regulatory compliance\u2014all from one place. Siteimprove.ai is also proud to offer best-in-class technical support, academy courses, services, and technology integrations.\u003C\/p\u003E\n\u003Cp\u003EFind out why more than 7,000 organizations around the world practice DPO using the Siteimprove Intelligence Platform at \u003Ca href=\u0022https:\/\/siteimprove.com\/en\/\u0022 rel=\u0022nofollow\u0022\u003Esiteimprove.com\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EInstallation guide\u003C\/strong\u003E\u003Cbr\u003E\nSiteimprove.ai Plugin can be installed like any other Drupal module.\u003Cbr\u003E\nPlace it in the modules directory for your site and enable it on the \u0027admin\/modules\u0027 page.\u003Cbr\u003E\nBy default the plugin is only available for administrators. If you want to allow other roles to use the plugin, go to your permissions page and enable it on the option \u201cAccess Siteimprove.ai Plugin\u201d (under the group \u201cSiteimprove.ai Plugin\u201d).\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EFrontend Domain Plugin\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003EIf a Drupal site has a domain for the frontend site that is different from the\u003Cbr\u003E\nbackend domain, this can be configured with existing plugins, or you can make\u003Cbr\u003E\nyour own.\u003C\/p\u003E\n\u003Cp\u003EIncluded with the module are two plugins for (1) the default case where the\u003Cbr\u003E\nfrontend domain is the same as the backend domain, and (2) the frontend domain\u003Cbr\u003E\nis a single domain and doesn\u0027t need advanced configuration.\u003C\/p\u003E\n\u003Cp\u003EIf you need Domain Access support, you can install the module\u003Cbr\u003E\nsiteimprove_domain_access. This module doesn\u0027t need to be configured, just\u003Cbr\u003E\nenable it and it will make sure Siteimprove.ai is notified with the correct\u003Cbr\u003E\nurl(s) for a given entity.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EAdding your own plugin\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003EUse the annotation discovery method with the annotation \u0027@SiteimproveDomain\u0027.\u003Cbr\u003E\nThis annotation has the variables \u0027id\u0027, \u0027label\u0027 (translatable), and\u003Cbr\u003E\n\u0027description\u0027 (translatable). See the plugin Simple\u003Cbr\u003E\n(src\/Plugin\/SiteimproveDomain\/Simple.php) for a plugin with no additional\u003Cbr\u003E\nconfiguration, and the plugin Single (src\/Plugin\/SiteimproveDomain\/Single.php)\u003Cbr\u003E\nfor a plugin with configuration.\u003C\/p\u003E\n\u003Cp\u003EThe plugin uses the ConfigFormBase trait, so if you want to save configuration\u003Cbr\u003E\nfor your plugin, you have to add the function \u0027getEditableConfigNames()\u0027, that\u003Cbr\u003E\nshould return a list of setting names. You can see the Single plugin for how to\u003Cbr\u003E\nsave configuration in the \u0027submitForm()\u0027 function, or - if you need a more\u003Cbr\u003E\nadvanced example - see the module siteimprove_domain_access.\u003C\/p\u003E\n\u003Cp\u003EThe following methods are required in a custom plugin: \u0027buildForm()\u0027 (will be\u003Cbr\u003E\ndisplayed on the Siteimprove.ai settings page) and \u0027getUrls()\u0027 (returns the urls\u003Cbr\u003E\nfor the current entity including http scheme \u0022http:\/\/\u0022 or \u0022https:\/\/\u0022).\u003C\/p\u003E\n\u003Cp\u003EThe following methods are optional: \u0027validateForm()\u0027 (validates the form, if\u003Cbr\u003E\nyour plugin requires configuration), \u0027submitForm()\u0027 (saves any changes to the\u003Cbr\u003E\nplugin\u0027s configuration), \u0027getEditableConfigNames()\u0027 (returns a list of setting\u003Cbr\u003E\nnames).\u003C\/p\u003E\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\u003C\/div\u003E","summary":"Siteimprove.ai Plugins keep insights within reach by integrating Drupal with the Siteimprove.ai Intelligence Platform, streamlining content creation with real-time results where they matter most."},"field_active_installs":"{\u00228.x-1.x\u0022:74,\u00222.0.x\u0022:2228,\u00223.0.x\u0022:4477}","field_active_installs_total":6779,"field_composer_namespace":"drupal\/siteimprove","field_core_semver_maximum":12000000,"field_core_semver_minimum":8000000,"field_issue_summary_template":null,"field_logo_url":{"uri":"https:\/\/git.drupalcode.org\/project\/siteimprove\/-\/avatar","title":null,"options":[]},"field_project_has_releases":true,"field_project_machine_name":"siteimprove","field_security_advisory_coverage":"covered"},"relationships":{"uid":{"data":{"type":"user--user","id":"e3e4aacb-139d-4d91-b390-0134be3b5c8b","meta":{"drupal_internal__target_id":3521441}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/e21ac647-51a7-4e1e-92f5-2d70db7ff3bb\/uid?resourceVersion=id%3A20040927"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/e21ac647-51a7-4e1e-92f5-2d70db7ff3bb\/relationships\/uid?resourceVersion=id%3A20040927"}}},"field_development_status":{"data":{"type":"taxonomy_term--development_status","id":"e767288c-9800-4fb4-aeb8-8c311533838a","meta":{"drupal_internal__target_id":27274}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/e21ac647-51a7-4e1e-92f5-2d70db7ff3bb\/field_development_status?resourceVersion=id%3A20040927"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/e21ac647-51a7-4e1e-92f5-2d70db7ff3bb\/relationships\/field_development_status?resourceVersion=id%3A20040927"}}},"field_maintenance_status":{"data":{"type":"taxonomy_term--maintenance_status","id":"089406ad-304d-4737-80d1-2f08527ae49e","meta":{"drupal_internal__target_id":27271}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/e21ac647-51a7-4e1e-92f5-2d70db7ff3bb\/field_maintenance_status?resourceVersion=id%3A20040927"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/e21ac647-51a7-4e1e-92f5-2d70db7ff3bb\/relationships\/field_maintenance_status?resourceVersion=id%3A20040927"}}},"field_module_categories":{"data":[{"type":"taxonomy_term--module_categories","id":"3df293b3-c9a1-4232-962b-3c8169e8e6e3","meta":{"drupal_internal__target_id":203}},{"type":"taxonomy_term--module_categories","id":"86237004-3801-40cf-96b5-fe7d60efccb5","meta":{"drupal_internal__target_id":187}},{"type":"taxonomy_term--module_categories","id":"01df2105-2397-4a0e-b34c-80da1c3b1208","meta":{"drupal_internal__target_id":201}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/e21ac647-51a7-4e1e-92f5-2d70db7ff3bb\/field_module_categories?resourceVersion=id%3A20040927"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/e21ac647-51a7-4e1e-92f5-2d70db7ff3bb\/relationships\/field_module_categories?resourceVersion=id%3A20040927"}}},"field_project_images":{"data":[{"type":"file--file","id":"daabda23-e2df-41f2-885b-6b3ae2b4eb43","meta":{"alt":"","title":null,"width":1204,"height":1560,"drupal_internal__target_id":35326}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/e21ac647-51a7-4e1e-92f5-2d70db7ff3bb\/field_project_images?resourceVersion=id%3A20040927"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/e21ac647-51a7-4e1e-92f5-2d70db7ff3bb\/relationships\/field_project_images?resourceVersion=id%3A20040927"}}}}},{"type":"node--project_module","id":"957202e3-25bd-4ee9-ba8b-3de70681de04","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/957202e3-25bd-4ee9-ba8b-3de70681de04?resourceVersion=id%3A20022395"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/957202e3-25bd-4ee9-ba8b-3de70681de04?resourceVersion=rel%3Aworking-copy"}},"attributes":{"drupal_internal__nid":1780496,"status":true,"title":"Mobile Detect","created":"2012-09-10T19:34:01+00:00","changed":"2026-04-07T05:20:02+00:00","moderation_state":null,"body":{"value":"This is a lightweight mobile detection module based on the \u003Ca href=\u0027http:\/\/mobiledetect.net\/\u0027\u003EMobile_Detect.php\u003C\/a\u003E library, which can be obtained from the \u003Ca href=\u0027https:\/\/github.com\/serbanghita\/Mobile-Detect\u0027\u003EGitHub repository\u003C\/a\u003E.\r\n\r\n\u003C!--break--\u003E\r\nThis module is designed to assist developers using mobile-first and responsive design techniques who also need to apply slight variations for mobile and tablet users.\r\n\r\nAn example use case would be showing or hiding a block based on the type of device.\r\n\r\n\u003Chr\/\u003E\r\n\r\n\u003Ch3\u003EInstallation\u003C\/h3\u003E\r\nUse composer to install the module and its dependencies.\r\n\u003Ccode\u003Ecomposer require \u0027drupal\/mobile_detect:^4.0\u0027\u003C\/code\u003E\r\n\u003C\/ul\u003E\r\n\r\n\u003Ch3\u003EWhat does it do?\u003C\/h3\u003E\r\nThis module allows you to configure block visibility conditions based on device type or platform via the Drupal user interface.\r\n\r\nThe \u003Cem\u003EMobile Detect Status\u003C\/em\u003E block is included for testing purposes.\r\n\r\nYou can also use it programmatically in your PHP code or within Twig templates.\r\n\r\n\u003Ch4\u003EPHP\u003C\/h4\u003E\r\n\u003Ccode\u003E\r\n$md = \\Drupal::service(\u0027mobile_detect\u0027);\r\n$is_mobile = $md-\u003EisMobile();\r\n$is_tablet = $md-\u003EisTablet();\r\n\u003C\/code\u003E\r\n\r\n\u003Ch4\u003ETwig Extensions\u003C\/h4\u003E\r\n\u003Ccode\u003E{% if is_mobile() %}\r\n{% if is_tablet() %}\r\n{% if is_device(\u0027iPhone\u0027) %}\r\n{% if is_ios() %}\r\n{% if is_android_os() %}\u003C\/code\u003E\r\n\r\nThere are not major upgrades so moving from 3.0.0 to 4.0.0 is safe.","format":"1","processed":"\u003Cdiv class=\u0022toc-filter\u0022\u003E\u003Cp\u003EThis is a lightweight mobile detection module based on the \u003Ca href=\u0022http:\/\/mobiledetect.net\/\u0022 rel=\u0022nofollow\u0022\u003EMobile_Detect.php\u003C\/a\u003E library, which can be obtained from the \u003Ca href=\u0022https:\/\/github.com\/serbanghita\/Mobile-Detect\u0022 rel=\u0022nofollow\u0022\u003EGitHub repository\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EThis module is designed to assist developers using mobile-first and responsive design techniques who also need to apply slight variations for mobile and tablet users.\u003C\/p\u003E\n\u003Cp\u003EAn example use case would be showing or hiding a block based on the type of device.\u003C\/p\u003E\n\u003Chr\u003E\n\u003Ch3 id=\u0022installation\u0022\u003EInstallation\u003C\/h3\u003E\n\u003Cp\u003EUse composer to install the module and its dependencies.\u003Cbr\u003E\n\u003Ccode\u003Ecomposer require \u0027drupal\/mobile_detect:^4.0\u0027\u003C\/code\u003E\n\n\u003C\/p\u003E\u003Ch3 id=\u0022what-does-it-do\u0022\u003EWhat does it do?\u003C\/h3\u003E\n\u003Cp\u003EThis module allows you to configure block visibility conditions based on device type or platform via the Drupal user interface.\u003C\/p\u003E\n\u003Cp\u003EThe \u003Cem\u003EMobile Detect Status\u003C\/em\u003E block is included for testing purposes.\u003C\/p\u003E\n\u003Cp\u003EYou can also use it programmatically in your PHP code or within Twig templates.\u003C\/p\u003E\n\u003Ch4 id=\u0022php\u0022\u003EPHP\u003C\/h4\u003E\n\u003Cp\u003E\u003Ccode\u003E\u003Cbr\u003E\n$md = \\Drupal::service(\u0027mobile_detect\u0027);\u003Cbr\u003E\n$is_mobile = $md-\u0026gt;isMobile();\u003Cbr\u003E\n$is_tablet = $md-\u0026gt;isTablet();\u003Cbr\u003E\n\u003C\/code\u003E\u003C\/p\u003E\n\u003Ch4 id=\u0022twig-extensions\u0022\u003ETwig Extensions\u003C\/h4\u003E\n\u003Cp\u003E\u003Ccode\u003E{% if is_mobile() %}\u003Cbr\u003E\n{% if is_tablet() %}\u003Cbr\u003E\n{% if is_device(\u0027iPhone\u0027) %}\u003Cbr\u003E\n{% if is_ios() %}\u003Cbr\u003E\n{% if is_android_os() %}\u003C\/code\u003E\u003C\/p\u003E\n\u003Cp\u003EThere are not major upgrades so moving from 3.0.0 to 4.0.0 is safe.\u003C\/p\u003E\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\u003C\/div\u003E","summary":""},"field_active_installs":"{\u00228.x-2.x\u0022:553,\u00223.0.x\u0022:2254,\u00224.0.x\u0022:1716}","field_active_installs_total":4523,"field_composer_namespace":"drupal\/mobile_detect","field_core_semver_maximum":12000000,"field_core_semver_minimum":8000000,"field_issue_summary_template":null,"field_logo_url":null,"field_project_has_releases":true,"field_project_machine_name":"mobile_detect","field_security_advisory_coverage":"covered"},"relationships":{"uid":{"data":{"type":"user--user","id":"885dfa93-5450-46e4-a7de-dbb359eaf9cb","meta":{"drupal_internal__target_id":325244}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/957202e3-25bd-4ee9-ba8b-3de70681de04\/uid?resourceVersion=id%3A20022395"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/957202e3-25bd-4ee9-ba8b-3de70681de04\/relationships\/uid?resourceVersion=id%3A20022395"}}},"field_development_status":{"data":{"type":"taxonomy_term--development_status","id":"e767288c-9800-4fb4-aeb8-8c311533838a","meta":{"drupal_internal__target_id":27274}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/957202e3-25bd-4ee9-ba8b-3de70681de04\/field_development_status?resourceVersion=id%3A20022395"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/957202e3-25bd-4ee9-ba8b-3de70681de04\/relationships\/field_development_status?resourceVersion=id%3A20022395"}}},"field_maintenance_status":{"data":{"type":"taxonomy_term--maintenance_status","id":"089406ad-304d-4737-80d1-2f08527ae49e","meta":{"drupal_internal__target_id":27271}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/957202e3-25bd-4ee9-ba8b-3de70681de04\/field_maintenance_status?resourceVersion=id%3A20022395"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/957202e3-25bd-4ee9-ba8b-3de70681de04\/relationships\/field_maintenance_status?resourceVersion=id%3A20022395"}}},"field_module_categories":{"data":[{"type":"taxonomy_term--module_categories","id":"3df293b3-c9a1-4232-962b-3c8169e8e6e3","meta":{"drupal_internal__target_id":203}},{"type":"taxonomy_term--module_categories","id":"754c04cb-6da2-42ba-9032-d64307f68f45","meta":{"drupal_internal__target_id":188}},{"type":"taxonomy_term--module_categories","id":"dcb48e9f-6afa-4842-8ef6-44b90b083fcc","meta":{"drupal_internal__target_id":200}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/957202e3-25bd-4ee9-ba8b-3de70681de04\/field_module_categories?resourceVersion=id%3A20022395"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/957202e3-25bd-4ee9-ba8b-3de70681de04\/relationships\/field_module_categories?resourceVersion=id%3A20022395"}}},"field_project_images":{"data":[{"type":"file--file","id":"0048fc5b-133d-41a3-902c-32dd818db6c9","meta":{"alt":"Mobile Detect Device","title":null,"width":441,"height":218,"drupal_internal__target_id":743138}},{"type":"file--file","id":"49c8a6cc-dcb9-4038-91ee-448a6c3dda50","meta":{"alt":"Mobile Detect Platform","title":null,"width":441,"height":218,"drupal_internal__target_id":743141}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/957202e3-25bd-4ee9-ba8b-3de70681de04\/field_project_images?resourceVersion=id%3A20022395"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/957202e3-25bd-4ee9-ba8b-3de70681de04\/relationships\/field_project_images?resourceVersion=id%3A20022395"}}}}},{"type":"node--project_module","id":"9e229b08-f58e-4a14-8249-d10a66ca43ac","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9e229b08-f58e-4a14-8249-d10a66ca43ac?resourceVersion=id%3A20051487"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9e229b08-f58e-4a14-8249-d10a66ca43ac?resourceVersion=rel%3Aworking-copy"}},"attributes":{"drupal_internal__nid":3192447,"status":true,"title":"Decorative Image Widget","created":"2021-01-13T00:40:21+00:00","changed":"2026-04-07T05:20:02+00:00","moderation_state":null,"body":{"value":"This module provides a solution for site builders that want to make the option of leaving an image\u0027s alternative text blank \u003Cem\u003Eexplicit\u003C\/em\u003E (by checking a new \u0022Decorative\u0022 checkbox) rather than \u003Cem\u003Eimplicit\u003C\/em\u003E (by simply leaving the alt text field blank).\r\n\r\nIn other words, editors are forced to affirm that the reason they\u0027re leaving alt text empty is because the image is \u003Ca href=\u0022https:\/\/www.w3.org\/WAI\/tutorials\/images\/decorative\/\u0022\u003Edecorative\u003C\/a\u003E and should be hidden from screen readers.\r\n\r\nIf the new \u0022Decorative\u0022 checkbox is not checked and no alt text is provided, the form will fail validation.\r\n\r\n\u003Ch2\u003EHow to Use\u003C\/h2\u003E\r\n\u003Col\u003E\r\n  \u003Cli\u003EEnable the module.\u003C\/li\u003E\r\n  \u003Cli\u003EEdit an image field and make sure alt text is enabled and NOT required.\u003C\/li\u003E\r\n  \u003Cli\u003EEdit the form display settings for the image and enable the option to force the image to be marked decorative when no alt text is provided.*\u003C\/li\u003E\r\n  \u003Cli\u003EAdd an image and observe you users cannot leave alt text blank without checking the \u0022Decorative\u0022 checkbox.\u003C\/li\u003E\r\n\u003C\/ol\u003E\r\n\r\n*Assumes your selected form widget is the one provided by core, or one that extends it.\r\n\r\n\u003Ch2\u003EFeatures\u003C\/h2\u003E\r\n\u003Col\u003E\r\n\u003Cli\u003EAdds a \u0022Decorative\u0022 checkbox to image widgets that must be checked if the user wants to leave the alt text empty.\r\n\u003Cli\u003EForces users to stop and think about alternative text rather than leaving it blank.\r\n\u003Cli\u003EWorks with any existing image widget that extends from core\u0027s default. For example, you can use this with the default image widget or the one provided by \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/image_widget_crop\u0022\u003EImage Widget Crop\u003C\/a\u003E.\r\n\u003Cli\u003EDoes not require any data model changes - the state of the \u0022Decorative\u0022 checkbox is inferred entirely from the value of the alt text.\r\n\u003C\/ol\u003E\r\n\r\n\u003Ch2\u003EA note on Media module usage\u003C\/h2\u003E\r\nMost Drupal 8 and newer sites are using core\u0027s Media and Media Library modules, which decouple images from the entity (e.g. a content type), allowing the same media to be used in many places on your site by reference.\r\n\r\nIt\u0027s important to keep in mind that good alternative text \u003Cstrong\u003Evaries depending on the context it is used\u003C\/strong\u003E. A content author should describe a picture of fireworks differently when displayed in an article about photography techniques vs an article about the event in general.\r\n\r\nAs such, while this module works just fine with the Media module, it\u0027s best not to rely on it if your site uses the same image in multiple different contexts, as you won\u0027t be able to change the alt text per context.\r\n\r\n\u003Ch2\u003EFurther Reading\u003C\/h2\u003E\r\nThere is an effort to make similar functionality available in Drupal core: [#2934405]","format":"1","processed":"\u003Cdiv class=\u0022toc-filter\u0022\u003E\u003Cp\u003EThis module provides a solution for site builders that want to make the option of leaving an image\u0027s alternative text blank \u003Cem\u003Eexplicit\u003C\/em\u003E (by checking a new \u0022Decorative\u0022 checkbox) rather than \u003Cem\u003Eimplicit\u003C\/em\u003E (by simply leaving the alt text field blank).\u003C\/p\u003E\n\u003Cp\u003EIn other words, editors are forced to affirm that the reason they\u0027re leaving alt text empty is because the image is \u003Ca href=\u0022https:\/\/www.w3.org\/WAI\/tutorials\/images\/decorative\/\u0022 rel=\u0022nofollow\u0022\u003Edecorative\u003C\/a\u003E and should be hidden from screen readers.\u003C\/p\u003E\n\u003Cp\u003EIf the new \u0022Decorative\u0022 checkbox is not checked and no alt text is provided, the form will fail validation.\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022how-to-use\u0022\u003EHow to Use\u003C\/h2\u003E\n\u003Col\u003E\n\u003Cli\u003EEnable the module.\u003C\/li\u003E\n\u003Cli\u003EEdit an image field and make sure alt text is enabled and NOT required.\u003C\/li\u003E\n\u003Cli\u003EEdit the form display settings for the image and enable the option to force the image to be marked decorative when no alt text is provided.*\u003C\/li\u003E\n\u003Cli\u003EAdd an image and observe you users cannot leave alt text blank without checking the \u0022Decorative\u0022 checkbox.\u003C\/li\u003E\n\u003C\/ol\u003E\n\u003Cp\u003E*Assumes your selected form widget is the one provided by core, or one that extends it.\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022features\u0022\u003EFeatures\u003C\/h2\u003E\n\u003Col\u003E\n\u003Cli\u003EAdds a \u0022Decorative\u0022 checkbox to image widgets that must be checked if the user wants to leave the alt text empty.\n\u003C\/li\u003E\u003Cli\u003EForces users to stop and think about alternative text rather than leaving it blank.\n\u003C\/li\u003E\u003Cli\u003EWorks with any existing image widget that extends from core\u0027s default. For example, you can use this with the default image widget or the one provided by \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/image_widget_crop\u0022 rel=\u0022nofollow\u0022\u003EImage Widget Crop\u003C\/a\u003E.\n\u003C\/li\u003E\u003Cli\u003EDoes not require any data model changes - the state of the \u0022Decorative\u0022 checkbox is inferred entirely from the value of the alt text.\n\u003C\/li\u003E\u003C\/ol\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022a-note-on-media-module-usage\u0022\u003EA note on Media module usage\u003C\/h2\u003E\n\u003Cp\u003EMost Drupal 8 and newer sites are using core\u0027s Media and Media Library modules, which decouple images from the entity (e.g. a content type), allowing the same media to be used in many places on your site by reference.\u003C\/p\u003E\n\u003Cp\u003EIt\u0027s important to keep in mind that good alternative text \u003Cstrong\u003Evaries depending on the context it is used\u003C\/strong\u003E. A content author should describe a picture of fireworks differently when displayed in an article about photography techniques vs an article about the event in general.\u003C\/p\u003E\n\u003Cp\u003EAs such, while this module works just fine with the Media module, it\u0027s best not to rely on it if your site uses the same image in multiple different contexts, as you won\u0027t be able to change the alt text per context.\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022further-reading\u0022\u003EFurther Reading\u003C\/h2\u003E\n\u003Cp\u003EThere is an effort to make similar functionality available in Drupal core: [#2934405]\u003C\/p\u003E\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\u003C\/div\u003E","summary":""},"field_active_installs":"{\u00221.0.x\u0022:4316}","field_active_installs_total":4316,"field_composer_namespace":"drupal\/decorative_image_widget","field_core_semver_maximum":12000000,"field_core_semver_minimum":8007007,"field_issue_summary_template":null,"field_logo_url":null,"field_project_has_releases":true,"field_project_machine_name":"decorative_image_widget","field_security_advisory_coverage":"covered"},"relationships":{"uid":{"data":{"type":"user--user","id":"d6052c61-dbd3-4f7b-90b6-d96142308e98","meta":{"drupal_internal__target_id":788032}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9e229b08-f58e-4a14-8249-d10a66ca43ac\/uid?resourceVersion=id%3A20051487"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9e229b08-f58e-4a14-8249-d10a66ca43ac\/relationships\/uid?resourceVersion=id%3A20051487"}}},"field_development_status":{"data":{"type":"taxonomy_term--development_status","id":"e767288c-9800-4fb4-aeb8-8c311533838a","meta":{"drupal_internal__target_id":27274}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9e229b08-f58e-4a14-8249-d10a66ca43ac\/field_development_status?resourceVersion=id%3A20051487"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9e229b08-f58e-4a14-8249-d10a66ca43ac\/relationships\/field_development_status?resourceVersion=id%3A20051487"}}},"field_maintenance_status":{"data":{"type":"taxonomy_term--maintenance_status","id":"089406ad-304d-4737-80d1-2f08527ae49e","meta":{"drupal_internal__target_id":27271}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9e229b08-f58e-4a14-8249-d10a66ca43ac\/field_maintenance_status?resourceVersion=id%3A20051487"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9e229b08-f58e-4a14-8249-d10a66ca43ac\/relationships\/field_maintenance_status?resourceVersion=id%3A20051487"}}},"field_module_categories":{"data":[{"type":"taxonomy_term--module_categories","id":"3df293b3-c9a1-4232-962b-3c8169e8e6e3","meta":{"drupal_internal__target_id":203}},{"type":"taxonomy_term--module_categories","id":"68428c33-1db7-438d-b1b3-e23004e0982b","meta":{"drupal_internal__target_id":192}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9e229b08-f58e-4a14-8249-d10a66ca43ac\/field_module_categories?resourceVersion=id%3A20051487"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9e229b08-f58e-4a14-8249-d10a66ca43ac\/relationships\/field_module_categories?resourceVersion=id%3A20051487"}}},"field_project_images":{"data":[{"type":"file--file","id":"e5acbd7a-78ed-46ab-8104-62919169d6fe","meta":{"alt":"screenshot of image widget form with the new \u0022decorative\u0022 checkbox checked","title":null,"width":834,"height":338,"drupal_internal__target_id":30858}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9e229b08-f58e-4a14-8249-d10a66ca43ac\/field_project_images?resourceVersion=id%3A20051487"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/9e229b08-f58e-4a14-8249-d10a66ca43ac\/relationships\/field_project_images?resourceVersion=id%3A20051487"}}}}},{"type":"node--project_module","id":"3c5a26ec-220c-474b-b82d-7bc76be5fa16","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/3c5a26ec-220c-474b-b82d-7bc76be5fa16?resourceVersion=id%3A20051465"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/3c5a26ec-220c-474b-b82d-7bc76be5fa16?resourceVersion=rel%3Aworking-copy"}},"attributes":{"drupal_internal__nid":3191857,"status":true,"title":"OEmbed Lazyload","created":"2021-01-09T19:05:08+00:00","changed":"2026-04-07T05:20:02+00:00","moderation_state":null,"body":{"value":"\u003Ch2\u003EMotivation\u003C\/h2\u003E\r\n\u003Cblockquote\u003EThe OEmbed Lazyload module aims to prevent the unnecessary loading of third party assets until such time that a user expresses interest in viewing the third party content or such content enters the viewport, depending on how the module is configured.\u003C\/blockquote\u003E\r\n\r\n\u003Ch3\u003ELoading third party content is slow\u003C\/h3\u003E\r\nThis project was developed in order to help optimize projects that rely heavily on \u003Cstrong\u003Ecore media\u003C\/strong\u003E oembed content.  Oembed on its own has the potential to load excessive third party assets even if a user has no intention of consuming the content.\r\n\r\nFor example, loading oembed content from YouTube can add nearly 750kB to what a user has to download on every page view.\r\n\u003Cimg src=\u0022\/files\/youtube-assets.png\u0022 alt=\u0022Chrome developer tools showing that third party YouTube assets cost approximately 750 kilobytes\u0022 \/\u003E\r\n\r\n\u003Ch3\u003ESome third party content providers offer a rich API\u003C\/h3\u003E\r\nOut of the box, there really isn\u0027t a good way to tap into any custom API\u0027s that a particular provider supports.  For example, there is an option to turn off YouTube branding on video embeds.  This module provides a mechanism to tap into these otherwise inaccessible customization points.\r\n\r\n\u003Ch2\u003EInstallation\u003C\/h2\u003E\r\nThe recommended installation method for this module is via composer.\r\n\u003Ccode\u003Ecomposer require drupal\/oembed_lazyload\u003C\/code\u003E\r\n\r\n\u003Ch2\u003EConfiguration\u003C\/h2\u003E\r\nAfter installing the module and any appropriate sub-module(s), the site builder must select the \u0022Lazy load oEmbed video\u0022 formatter in the appropriate media view display configuration.\r\n\u003Cimg src=\u0022\/files\/oembed-lazyload-config.png\u0022 alt=\u0022Image depicting a site builder setting the Lazy load oEmbed video formatter\u0022 \/\u003E\r\n\r\n\u003Ch2\u003EHow does it work?\u003C\/h2\u003E\r\nThe premise behind the mechanism is deceptively simple.  It leverages the fact that Drupal wraps oEmbed content in an iframe for security purposes (https:\/\/oembed.com\/#section3).  This module provides a Field Formatter that delays the loading of this iframe until a user clicks a \u0022Play\u0022 button or when the iframe enters the viewport.  It also allows plugins to influence the content returned from the oembed provider before serving it to the user.\r\n\r\nSub-modules (notably the \u003Ccode\u003Eoembed_lazyload_youtube\u003C\/code\u003E module), enhances the user-experience through various mechanisms introduced by the new formatter type.\r\n\r\n\u003Ch2\u003EPage Speed Metrics\u003C\/h2\u003E\r\nPage speed insights (https:\/\/developers.google.com\/speed\/pagespeed\/insights\/) shows that lazy loading oEmbed content can have a dramatic effect on perceived page load times.\r\n\u003Ch3\u003EBefore\u003C\/h3\u003E\r\n\u003Cimg src=\u0022\/files\/bartik-before_0.png\u0022 alt=\u0022Page speed insights score of 60 with the core oEmbed formatter\u0022 \/\u003E\r\n\u003Ch3\u003EAfter\u003C\/h3\u003E\r\n\u003Cimg src=\u0022\/files\/bartik-after_0.png\u0022 alt=\u0022Page speed insights score of 98 after switching to the Lazy load formatter\u0022 \/\u003E\r\n\r\n\u003Ch2\u003EBackward Compatibility \/ Upgrade Paths\u003C\/h2\u003E\r\nDev releases offer no BC guarantees whatsoever nor do they guarantee upgrade paths.  Any data model and interface changes can be made without any release notes.  Dev releases are not ready for production use.\r\n\r\nAlpha releases offer no BC guarantees on interfaces.  Data model changes will be communicated out via release notes.  No automated upgrade paths will be made available.\r\n\r\nBeta releases offer no BC guarantees on interfaces.  Any breaking changes will be communicated out via release notes.  No automated upgrade paths will be made available.\r\n\r\nRC releases offer BC guarantees on interfaces and data models.  Upgrade paths will be made available.\r\n\r\nStable releases offer the same guarantees as RC releases, but will also be under the Security Advisory Program.\r\n\r\n\u003Ch2\u003ENeed Help?\u003C\/h2\u003E\r\nFeel free to reach out at #oembed-lazyload at https:\/\/drupal.slack.com or send me a DM.  I\u0027m \u003Ccode\u003Elleber\u003C\/code\u003E on slack.","format":"1","processed":"\u003Cdiv class=\u0022toc-filter\u0022\u003E\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022motivation\u0022\u003EMotivation\u003C\/h2\u003E\n\u003Cblockquote\u003E\u003Cp\u003EThe OEmbed Lazyload module aims to prevent the unnecessary loading of third party assets until such time that a user expresses interest in viewing the third party content or such content enters the viewport, depending on how the module is configured.\u003C\/p\u003E\u003C\/blockquote\u003E\n\u003Ch3 id=\u0022loading-third-party-content-is-slow\u0022\u003ELoading third party content is slow\u003C\/h3\u003E\n\u003Cp\u003EThis project was developed in order to help optimize projects that rely heavily on \u003Cstrong\u003Ecore media\u003C\/strong\u003E oembed content.  Oembed on its own has the potential to load excessive third party assets even if a user has no intention of consuming the content.\u003C\/p\u003E\n\u003Cp\u003EFor example, loading oembed content from YouTube can add nearly 750kB to what a user has to download on every page view.\u003Cbr\u003E\n\u003Cimg src=\u0022\/core\/misc\/icons\/e32700\/error.svg\u0022 alt=\u0022Image removed.\u0022 title=\u0022This image has been removed. For security reasons, only images from the local domain are allowed.\u0022 height=\u002216\u0022 width=\u002216\u0022 class=\u0022filter-image-invalid\u0022\u003E\u003C\/p\u003E\n\u003Ch3 id=\u0022some-third-party-content-providers-offer-a-rich-api\u0022\u003ESome third party content providers offer a rich API\u003C\/h3\u003E\n\u003Cp\u003EOut of the box, there really isn\u0027t a good way to tap into any custom API\u0027s that a particular provider supports.  For example, there is an option to turn off YouTube branding on video embeds.  This module provides a mechanism to tap into these otherwise inaccessible customization points.\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022installation\u0022\u003EInstallation\u003C\/h2\u003E\n\u003Cp\u003EThe recommended installation method for this module is via composer.\u003Cbr\u003E\n\u003Ccode\u003Ecomposer require drupal\/oembed_lazyload\u003C\/code\u003E\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022configuration\u0022\u003EConfiguration\u003C\/h2\u003E\n\u003Cp\u003EAfter installing the module and any appropriate sub-module(s), the site builder must select the \u0022Lazy load oEmbed video\u0022 formatter in the appropriate media view display configuration.\u003Cbr\u003E\n\u003Cimg src=\u0022\/core\/misc\/icons\/e32700\/error.svg\u0022 alt=\u0022Image removed.\u0022 title=\u0022This image has been removed. For security reasons, only images from the local domain are allowed.\u0022 height=\u002216\u0022 width=\u002216\u0022 class=\u0022filter-image-invalid\u0022\u003E\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022how-does-it-work\u0022\u003EHow does it work?\u003C\/h2\u003E\n\u003Cp\u003EThe premise behind the mechanism is deceptively simple.  It leverages the fact that Drupal wraps oEmbed content in an iframe for security purposes (\u003Ca href=\u0022https:\/\/oembed.com\/#section3\u0022 rel=\u0022nofollow\u0022\u003Ehttps:\/\/oembed.com\/#section3\u003C\/a\u003E).  This module provides a Field Formatter that delays the loading of this iframe until a user clicks a \u0022Play\u0022 button or when the iframe enters the viewport.  It also allows plugins to influence the content returned from the oembed provider before serving it to the user.\u003C\/p\u003E\n\u003Cp\u003ESub-modules (notably the \u003Ccode\u003Eoembed_lazyload_youtube\u003C\/code\u003E module), enhances the user-experience through various mechanisms introduced by the new formatter type.\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022page-speed-metrics\u0022\u003EPage Speed Metrics\u003C\/h2\u003E\n\u003Cp\u003EPage speed insights (\u003Ca href=\u0022https:\/\/developers.google.com\/speed\/pagespeed\/insights\/\u0022 rel=\u0022nofollow\u0022\u003Ehttps:\/\/developers.google.com\/speed\/pagespeed\/insights\/\u003C\/a\u003E) shows that lazy loading oEmbed content can have a dramatic effect on perceived page load times.\u003C\/p\u003E\n\u003Ch3 id=\u0022before\u0022\u003EBefore\u003C\/h3\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/files\/bartik-before_0.png\u0022 alt=\u0022Page speed insights score of 60 with the core oEmbed formatter\u0022\u003E\u003C\/p\u003E\n\u003Ch3 id=\u0022after\u0022\u003EAfter\u003C\/h3\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/files\/bartik-after_0.png\u0022 alt=\u0022Page speed insights score of 98 after switching to the Lazy load formatter\u0022\u003E\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022backward-compatibility-upgrade-paths\u0022\u003EBackward Compatibility \/ Upgrade Paths\u003C\/h2\u003E\n\u003Cp\u003EDev releases offer no BC guarantees whatsoever nor do they guarantee upgrade paths.  Any data model and interface changes can be made without any release notes.  Dev releases are not ready for production use.\u003C\/p\u003E\n\u003Cp\u003EAlpha releases offer no BC guarantees on interfaces.  Data model changes will be communicated out via release notes.  No automated upgrade paths will be made available.\u003C\/p\u003E\n\u003Cp\u003EBeta releases offer no BC guarantees on interfaces.  Any breaking changes will be communicated out via release notes.  No automated upgrade paths will be made available.\u003C\/p\u003E\n\u003Cp\u003ERC releases offer BC guarantees on interfaces and data models.  Upgrade paths will be made available.\u003C\/p\u003E\n\u003Cp\u003EStable releases offer the same guarantees as RC releases, but will also be under the Security Advisory Program.\u003C\/p\u003E\n\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\n\n\u003Ch2 id=\u0022need-help\u0022\u003ENeed Help?\u003C\/h2\u003E\n\u003Cp\u003EFeel free to reach out at #oembed-lazyload at \u003Ca href=\u0022https:\/\/drupal.slack.com\u0022 rel=\u0022nofollow\u0022\u003Ehttps:\/\/drupal.slack.com\u003C\/a\u003E or send me a DM.  I\u0027m \u003Ccode\u003Elleber\u003C\/code\u003E on slack.\u003C\/p\u003E\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\u003C\/div\u003E","summary":""},"field_active_installs":"{\u00221.0.x\u0022:19,\u00222.0.x\u0022:2048}","field_active_installs_total":2067,"field_composer_namespace":"drupal\/oembed_lazyload","field_core_semver_maximum":12000000,"field_core_semver_minimum":8000000,"field_issue_summary_template":null,"field_logo_url":null,"field_project_has_releases":true,"field_project_machine_name":"oembed_lazyload","field_security_advisory_coverage":"covered"},"relationships":{"uid":{"data":{"type":"user--user","id":"b838d119-25c6-44b2-adc2-372e8a8b87cd","meta":{"drupal_internal__target_id":3509746}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/3c5a26ec-220c-474b-b82d-7bc76be5fa16\/uid?resourceVersion=id%3A20051465"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/3c5a26ec-220c-474b-b82d-7bc76be5fa16\/relationships\/uid?resourceVersion=id%3A20051465"}}},"field_development_status":{"data":{"type":"taxonomy_term--development_status","id":"e767288c-9800-4fb4-aeb8-8c311533838a","meta":{"drupal_internal__target_id":27274}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/3c5a26ec-220c-474b-b82d-7bc76be5fa16\/field_development_status?resourceVersion=id%3A20051465"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/3c5a26ec-220c-474b-b82d-7bc76be5fa16\/relationships\/field_development_status?resourceVersion=id%3A20051465"}}},"field_maintenance_status":{"data":{"type":"taxonomy_term--maintenance_status","id":"089406ad-304d-4737-80d1-2f08527ae49e","meta":{"drupal_internal__target_id":27271}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/3c5a26ec-220c-474b-b82d-7bc76be5fa16\/field_maintenance_status?resourceVersion=id%3A20051465"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/3c5a26ec-220c-474b-b82d-7bc76be5fa16\/relationships\/field_maintenance_status?resourceVersion=id%3A20051465"}}},"field_module_categories":{"data":[{"type":"taxonomy_term--module_categories","id":"3df293b3-c9a1-4232-962b-3c8169e8e6e3","meta":{"drupal_internal__target_id":203}},{"type":"taxonomy_term--module_categories","id":"68428c33-1db7-438d-b1b3-e23004e0982b","meta":{"drupal_internal__target_id":192}},{"type":"taxonomy_term--module_categories","id":"d1322ab4-e2be-4f21-9e01-8c19b3da8bea","meta":{"drupal_internal__target_id":197}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/3c5a26ec-220c-474b-b82d-7bc76be5fa16\/field_module_categories?resourceVersion=id%3A20051465"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/3c5a26ec-220c-474b-b82d-7bc76be5fa16\/relationships\/field_module_categories?resourceVersion=id%3A20051465"}}},"field_project_images":{"data":[],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/3c5a26ec-220c-474b-b82d-7bc76be5fa16\/field_project_images?resourceVersion=id%3A20051465"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/3c5a26ec-220c-474b-b82d-7bc76be5fa16\/relationships\/field_project_images?resourceVersion=id%3A20051465"}}}}},{"type":"node--project_module","id":"dcbd138d-8a12-41ed-b41d-517609d9634f","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/dcbd138d-8a12-41ed-b41d-517609d9634f?resourceVersion=id%3A20050698"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/dcbd138d-8a12-41ed-b41d-517609d9634f?resourceVersion=rel%3Aworking-copy"}},"attributes":{"drupal_internal__nid":3161395,"status":true,"title":"Text field formatter","created":"2020-07-25T07:19:52+00:00","changed":"2026-04-07T05:20:02+00:00","moderation_state":null,"body":{"value":"This module is the extension of the plain text formatter. \r\n\r\n\u003Cstrong\u003EThe module features:\u003C\/strong\u003E\r\n\u003Cul\u003E\r\n  \u003Cli\u003EAbility to add an additional wrapper to the text field.\u003C\/li\u003E\r\n  \u003Cli\u003EAbility to add classes to this wrapper.\u003C\/li\u003E\r\n  \u003Cli\u003EAbility to add any of the attributes to this wrapper.\u003C\/li\u003E\r\n  \u003Cli\u003EThe option for overriding a link label (tokens are supported).\u003C\/li\u003E\r\n\u003C\/ul\u003E\r\n\r\n\u003Cstrong\u003ECompatible with Layout Builder - the easiest way to add an H1 tag to the node title on the page.\u003C\/strong\u003E\r\nCompatible with the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/linked_field\u0022\u003ELinked field\u003C\/a\u003E.\r\n\r\nThe idea behind this module is taken from another similar module: \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/string_field_formatter\u0022\u003EString field formatter\u003C\/a\u003E\r\n\r\nBut they have a difference:\r\nThe String field formatter is an independent formatter but this module extended the plain text formatter from the Drupal core and inherit options like this - \u0022Link to the Content\u0022 checkbox.","format":"1","processed":"\u003Cp\u003EThis module is the extension of the plain text formatter. \u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EThe module features:\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EAbility to add an additional wrapper to the text field.\u003C\/li\u003E\n\u003Cli\u003EAbility to add classes to this wrapper.\u003C\/li\u003E\n\u003Cli\u003EAbility to add any of the attributes to this wrapper.\u003C\/li\u003E\n\u003Cli\u003EThe option for overriding a link label (tokens are supported).\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003E\u003Cstrong\u003ECompatible with Layout Builder - the easiest way to add an H1 tag to the node title on the page.\u003C\/strong\u003E\u003Cbr\u003E\nCompatible with the \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/linked_field\u0022 rel=\u0022nofollow\u0022\u003ELinked field\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EThe idea behind this module is taken from another similar module: \u003Ca href=\u0022https:\/\/www.drupal.org\/project\/string_field_formatter\u0022 rel=\u0022nofollow\u0022\u003EString field formatter\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003EBut they have a difference:\u003Cbr\u003E\nThe String field formatter is an independent formatter but this module extended the plain text formatter from the Drupal core and inherit options like this - \u0022Link to the Content\u0022 checkbox.\u003C\/p\u003E","summary":""},"field_active_installs":"{\u00222.0.x\u0022:1973}","field_active_installs_total":1973,"field_composer_namespace":"drupal\/text_field_formatter","field_core_semver_maximum":12999999,"field_core_semver_minimum":8000000,"field_issue_summary_template":null,"field_logo_url":null,"field_project_has_releases":true,"field_project_machine_name":"text_field_formatter","field_security_advisory_coverage":"covered"},"relationships":{"uid":{"data":{"type":"user--user","id":"92fc198c-6cdd-4353-9689-ee069cf5805e","meta":{"drupal_internal__target_id":3558183}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/dcbd138d-8a12-41ed-b41d-517609d9634f\/uid?resourceVersion=id%3A20050698"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/dcbd138d-8a12-41ed-b41d-517609d9634f\/relationships\/uid?resourceVersion=id%3A20050698"}}},"field_development_status":{"data":{"type":"taxonomy_term--development_status","id":"e767288c-9800-4fb4-aeb8-8c311533838a","meta":{"drupal_internal__target_id":27274}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/dcbd138d-8a12-41ed-b41d-517609d9634f\/field_development_status?resourceVersion=id%3A20050698"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/dcbd138d-8a12-41ed-b41d-517609d9634f\/relationships\/field_development_status?resourceVersion=id%3A20050698"}}},"field_maintenance_status":{"data":{"type":"taxonomy_term--maintenance_status","id":"089406ad-304d-4737-80d1-2f08527ae49e","meta":{"drupal_internal__target_id":27271}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/dcbd138d-8a12-41ed-b41d-517609d9634f\/field_maintenance_status?resourceVersion=id%3A20050698"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/dcbd138d-8a12-41ed-b41d-517609d9634f\/relationships\/field_maintenance_status?resourceVersion=id%3A20050698"}}},"field_module_categories":{"data":[{"type":"taxonomy_term--module_categories","id":"3df293b3-c9a1-4232-962b-3c8169e8e6e3","meta":{"drupal_internal__target_id":203}},{"type":"taxonomy_term--module_categories","id":"86237004-3801-40cf-96b5-fe7d60efccb5","meta":{"drupal_internal__target_id":187}},{"type":"taxonomy_term--module_categories","id":"754c04cb-6da2-42ba-9032-d64307f68f45","meta":{"drupal_internal__target_id":188}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/dcbd138d-8a12-41ed-b41d-517609d9634f\/field_module_categories?resourceVersion=id%3A20050698"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/dcbd138d-8a12-41ed-b41d-517609d9634f\/relationships\/field_module_categories?resourceVersion=id%3A20050698"}}},"field_project_images":{"data":[{"type":"file--file","id":"bfb0e572-38b2-49e9-ba74-97c8247e3158","meta":{"alt":"","title":null,"width":1803,"height":758,"drupal_internal__target_id":30456}},{"type":"file--file","id":"3d8b01fc-bdfc-4748-864f-60a51c1587de","meta":{"alt":"","title":null,"width":1806,"height":135,"drupal_internal__target_id":30037}},{"type":"file--file","id":"d245efd1-1031-405a-98d6-fda75f375c7c","meta":{"alt":"","title":null,"width":1404,"height":452,"drupal_internal__target_id":30038}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/dcbd138d-8a12-41ed-b41d-517609d9634f\/field_project_images?resourceVersion=id%3A20050698"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/dcbd138d-8a12-41ed-b41d-517609d9634f\/relationships\/field_project_images?resourceVersion=id%3A20050698"}}}}},{"type":"node--project_module","id":"f283be13-fc68-4ae4-b69f-931ac231d517","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/f283be13-fc68-4ae4-b69f-931ac231d517?resourceVersion=id%3A20057298"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/f283be13-fc68-4ae4-b69f-931ac231d517?resourceVersion=rel%3Aworking-copy"}},"attributes":{"drupal_internal__nid":3464777,"status":true,"title":"CKEditor Responsive Table","created":"2024-07-30T19:43:46+00:00","changed":"2026-04-07T05:20:02+00:00","moderation_state":null,"body":{"value":"This module is a CKEditor 5 plugin that adds a table button with some accessibility improvements over the default CKE table button. It also integrates with the \u003Ca href=\u0022https:\/\/github.com\/Lullabot\/tabled\u0022\u003ETabled\u003C\/a\u003E plugin for making tables to be adaptable to different devices.\r\n\r\n\u003Ch3 id=\u0022module-project--features\u0022\u003EFeatures\u003C\/h3\u003E\r\n\r\nThis responsive table is accessible by default. The button provides controls to set the number of \u003Cstrong\u003ERows\u003C\/strong\u003E and \u003Cstrong\u003EColumns\u003C\/strong\u003E. It also provides \u003Cstrong\u003EHeaders\u003C\/strong\u003E options, \u003Cstrong\u003ECaption\u003C\/strong\u003E, and a \u003Cstrong\u003ECaption Visible?\u003C\/strong\u003E checkbox.\r\n\r\nThe main differences with the built-in table CKE button are:\r\n\u003Cul\u003E\r\n  \u003Cli\u003ECaption is mandatory, you can choose to hide them or showing them but it needs to be present. \u003C\/li\u003E\r\n  \u003Cli\u003ECaptions are always present for assistive technologies.\u003C\/li\u003E\r\n  \u003Cli\u003EHeaders are mandatory, either by rows or rows and columns.\u003C\/li\u003E\r\n  \u003Cli\u003EHeaders have a \u003Ccode\u003Escope=column\u003C\/code\u003E added when appropriate.\u003C\/li\u003E\r\n\u003C\/ul\u003E\r\n\r\nOnce the table is inserted into the editor, there are controls for inserting, deleting, splitting, and merging columns and rows, as well toggling the caption visibility.\r\n\r\nThis plugin doesn\u0027t make any efforts on cleaning up or fixing copy and pasted tables, but it ensures that tables created through the table button to be accessible.\r\n\r\n\u003Ch3 id=\u0022module-project--post-installation\u0022\u003EPost-Installation\u003C\/h3\u003E\r\n\r\n\u003Cul\u003E\r\n    \u003Cli\u003EConfigure text formats by navigating to \u003Cstrong\u003EConfiguration \u003E Content authoring \u003E Text formats and editors\u003C\/strong\u003E, or visiting \u003Ccode\u003E\/admin\/config\/content\/formats\u003C\/code\u003E.\u003C\/li\u003E\r\n    \u003Cli\u003EClick \u003Cstrong\u003EConfigure\u003C\/strong\u003E next to a text format that has CKEditor 5 enabled as the \u003Cstrong\u003EText format\u003C\/strong\u003E that you\u0027d like to add the responsive table functionality to.\u003C\/li\u003E\r\n    \u003Cli\u003EDrag the Responsive Table button from the \u003Cstrong\u003EAvailable Buttons\u003C\/strong\u003E area to the \u003Cstrong\u003EActive toolbar\u003C\/strong\u003E area.\u003C\/li\u003E\r\n    \u003Cli\u003EClick \u003Cstrong\u003ESave configuration\u003C\/strong\u003E.\u003C\/li\u003E\r\n\u003C\/ul\u003E\r\n\r\n\r\n\u003Ch3 id=\u0022module-project--additional-requirements\u0022\u003EAdditional Requirements\u003C\/h3\u003E\r\n\r\nDrupal 9.3 or greater.\r\n\r\n\u003Ch3 id=\u0022module-project--credits\u0022\u003ECredits\u003C\/h3\u003E\r\n\r\nDeveloped by:\r\n\r\n\u003Cul\u003E\r\n  \u003Cli\u003EElvis Moreta\u003C\/li\u003E\r\n  \u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/u\/javi-er\u0022\u003EJavier Reartes\u003C\/a\u003E\u003C\/li\u003E\r\n  \u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/u\/monicadear\u0022\u003ENikki Flores\u003C\/a\u003E\u003C\/li\u003E\r\n  \u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/u\/deviantintegral\u0022\u003EAndrew Berry\u003C\/a\u003E\u003C\/li\u003E\r\n\u003C\/ul\u003E","format":"1","processed":"\u003Cdiv class=\u0022toc-filter\u0022\u003E\u003Cp\u003EThis module is a CKEditor 5 plugin that adds a table button with some accessibility improvements over the default CKE table button. It also integrates with the \u003Ca href=\u0022https:\/\/github.com\/Lullabot\/tabled\u0022 rel=\u0022nofollow\u0022\u003ETabled\u003C\/a\u003E plugin for making tables to be adaptable to different devices.\u003C\/p\u003E\n\u003Ch3 id=\u0022module-project--features-01\u0022\u003EFeatures\u003C\/h3\u003E\n\u003Cp\u003EThis responsive table is accessible by default. The button provides controls to set the number of \u003Cstrong\u003ERows\u003C\/strong\u003E and \u003Cstrong\u003EColumns\u003C\/strong\u003E. It also provides \u003Cstrong\u003EHeaders\u003C\/strong\u003E options, \u003Cstrong\u003ECaption\u003C\/strong\u003E, and a \u003Cstrong\u003ECaption Visible?\u003C\/strong\u003E checkbox.\u003C\/p\u003E\n\u003Cp\u003EThe main differences with the built-in table CKE button are:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003ECaption is mandatory, you can choose to hide them or showing them but it needs to be present. \u003C\/li\u003E\n\u003Cli\u003ECaptions are always present for assistive technologies.\u003C\/li\u003E\n\u003Cli\u003EHeaders are mandatory, either by rows or rows and columns.\u003C\/li\u003E\n\u003Cli\u003EHeaders have a \u003Ccode\u003Escope=column\u003C\/code\u003E added when appropriate.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EOnce the table is inserted into the editor, there are controls for inserting, deleting, splitting, and merging columns and rows, as well toggling the caption visibility.\u003C\/p\u003E\n\u003Cp\u003EThis plugin doesn\u0027t make any efforts on cleaning up or fixing copy and pasted tables, but it ensures that tables created through the table button to be accessible.\u003C\/p\u003E\n\u003Ch3 id=\u0022module-project--post-installation-01\u0022\u003EPost-Installation\u003C\/h3\u003E\n\u003Cul\u003E\n\u003Cli\u003EConfigure text formats by navigating to \u003Cstrong\u003EConfiguration \u0026gt; Content authoring \u0026gt; Text formats and editors\u003C\/strong\u003E, or visiting \u003Ccode\u003E\/admin\/config\/content\/formats\u003C\/code\u003E.\u003C\/li\u003E\n\u003Cli\u003EClick \u003Cstrong\u003EConfigure\u003C\/strong\u003E next to a text format that has CKEditor 5 enabled as the \u003Cstrong\u003EText format\u003C\/strong\u003E that you\u0027d like to add the responsive table functionality to.\u003C\/li\u003E\n\u003Cli\u003EDrag the Responsive Table button from the \u003Cstrong\u003EAvailable Buttons\u003C\/strong\u003E area to the \u003Cstrong\u003EActive toolbar\u003C\/strong\u003E area.\u003C\/li\u003E\n\u003Cli\u003EClick \u003Cstrong\u003ESave configuration\u003C\/strong\u003E.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3 id=\u0022module-project--additional-requirements-01\u0022\u003EAdditional Requirements\u003C\/h3\u003E\n\u003Cp\u003EDrupal 9.3 or greater.\u003C\/p\u003E\n\u003Ch3 id=\u0022module-project--credits-01\u0022\u003ECredits\u003C\/h3\u003E\n\u003Cp\u003EDeveloped by:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EElvis Moreta\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/u\/javi-er\u0022 rel=\u0022nofollow\u0022\u003EJavier Reartes\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/u\/monicadear\u0022 rel=\u0022nofollow\u0022\u003ENikki Flores\u003C\/a\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ca href=\u0022https:\/\/www.drupal.org\/u\/deviantintegral\u0022 rel=\u0022nofollow\u0022\u003EAndrew Berry\u003C\/a\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\u003C\/div\u003E","summary":""},"field_active_installs":"{\u00221.0.x\u0022:1916}","field_active_installs_total":1916,"field_composer_namespace":"drupal\/ckeditor_responsive_table","field_core_semver_maximum":12000000,"field_core_semver_minimum":9000000,"field_issue_summary_template":null,"field_logo_url":null,"field_project_has_releases":true,"field_project_machine_name":"ckeditor_responsive_table","field_security_advisory_coverage":"covered"},"relationships":{"uid":{"data":{"type":"user--user","id":"f97fd29f-58b6-48bb-871a-ba8d3f89e800","meta":{"drupal_internal__target_id":409665}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/f283be13-fc68-4ae4-b69f-931ac231d517\/uid?resourceVersion=id%3A20057298"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/f283be13-fc68-4ae4-b69f-931ac231d517\/relationships\/uid?resourceVersion=id%3A20057298"}}},"field_development_status":{"data":{"type":"taxonomy_term--development_status","id":"e767288c-9800-4fb4-aeb8-8c311533838a","meta":{"drupal_internal__target_id":27274}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/f283be13-fc68-4ae4-b69f-931ac231d517\/field_development_status?resourceVersion=id%3A20057298"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/f283be13-fc68-4ae4-b69f-931ac231d517\/relationships\/field_development_status?resourceVersion=id%3A20057298"}}},"field_maintenance_status":{"data":{"type":"taxonomy_term--maintenance_status","id":"089406ad-304d-4737-80d1-2f08527ae49e","meta":{"drupal_internal__target_id":27271}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/f283be13-fc68-4ae4-b69f-931ac231d517\/field_maintenance_status?resourceVersion=id%3A20057298"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/f283be13-fc68-4ae4-b69f-931ac231d517\/relationships\/field_maintenance_status?resourceVersion=id%3A20057298"}}},"field_module_categories":{"data":[{"type":"taxonomy_term--module_categories","id":"3df293b3-c9a1-4232-962b-3c8169e8e6e3","meta":{"drupal_internal__target_id":203}},{"type":"taxonomy_term--module_categories","id":"754c04cb-6da2-42ba-9032-d64307f68f45","meta":{"drupal_internal__target_id":188}},{"type":"taxonomy_term--module_categories","id":"86237004-3801-40cf-96b5-fe7d60efccb5","meta":{"drupal_internal__target_id":187}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/f283be13-fc68-4ae4-b69f-931ac231d517\/field_module_categories?resourceVersion=id%3A20057298"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/f283be13-fc68-4ae4-b69f-931ac231d517\/relationships\/field_module_categories?resourceVersion=id%3A20057298"}}},"field_project_images":{"data":[{"type":"file--file","id":"ad7d430e-3bda-4f74-b2ba-a0bfd2346dee","meta":{"alt":"CKEditor 5 responsive table insert dialog featuring fields for rows, columns, headers and optional caption","title":null,"width":null,"height":null,"drupal_internal__target_id":37601}},{"type":"file--file","id":"cc3665be-4de1-4428-8b48-be7306f79d20","meta":{"alt":"Example of a table rendering using the Tabled JS plugin","title":null,"width":1732,"height":1956,"drupal_internal__target_id":37602}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/f283be13-fc68-4ae4-b69f-931ac231d517\/field_project_images?resourceVersion=id%3A20057298"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/f283be13-fc68-4ae4-b69f-931ac231d517\/relationships\/field_project_images?resourceVersion=id%3A20057298"}}}}},{"type":"node--project_module","id":"6dc3aa24-eb6f-4ccd-854d-c08303bf15f1","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6dc3aa24-eb6f-4ccd-854d-c08303bf15f1?resourceVersion=id%3A20048919"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6dc3aa24-eb6f-4ccd-854d-c08303bf15f1?resourceVersion=rel%3Aworking-copy"}},"attributes":{"drupal_internal__nid":3090051,"status":true,"title":"Status Messages","created":"2019-10-25T06:09:58+00:00","changed":"2026-04-07T05:20:02+00:00","moderation_state":null,"body":{"value":"Status Messages which floats to the top right of the page as a pop-up message and has a close button.\r\nIt has configuration until how much time we want to display the message. For eg [5,10,15,20     seconds or never]. \r\nAfter selected time status message will be faded out and will hide from the display.\r\n\r\n\u003Cimg src=\u0022https:\/\/www.drupal.org\/files\/project-images\/status-messages-config.png\u0022 width=\u0022100%\u0022 height=\u0022166\u0022 alt=\u0022\u0022 title=\u0022\u0022\u003E\r\n\r\n\u003Cimg src=\u0022https:\/\/www.drupal.org\/files\/project-images\/status-messages.png\u0022 width=\u0022100%\u0022 height=\u0022166\u0022 alt=\u0022\u0022 title=\u0022\u0022\u003E\r\n\r\n\u003Ch3\u003E Credits \u003C\/h3\u003E\r\nStatus Messages Logo by \u003Ca href=\u0022https:\/\/www.drupal.org\/u\/grienauer\u0022\u003ENico Grienauer (Grienauer)\u003C\/a\u003E\r\n\r\n\u003Ch3\u003EWant to support the development of this project?\u003C\/h3\u003E\r\n \t \t\r\n\u003Ca class=\u0022action-button\u0022 href=\u0022https:\/\/www.buymeacoffee.com\/neslee\u0022 target=\u0022blank\u0022 rel=\u0022nofollow\u0022\u003EBuy me a coffee \u2615\ufe0f\u003C\/a\u003E","format":"1","processed":"\u003Cdiv class=\u0022toc-filter\u0022\u003E\u003Cp\u003EStatus Messages which floats to the top right of the page as a pop-up message and has a close button.\u003Cbr\u003E\nIt has configuration until how much time we want to display the message. For eg [5,10,15,20     seconds or never].\u003Cbr\u003E\nAfter selected time status message will be faded out and will hide from the display.\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/files\/project-images\/status-messages-config.png\u0022 width=\u0022100%\u0022 height=\u0022166\u0022 alt\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/files\/project-images\/status-messages.png\u0022 width=\u0022100%\u0022 height=\u0022166\u0022 alt\u003E\u003C\/p\u003E\n\u003Ch3 id=\u0022credits\u0022\u003E Credits \u003C\/h3\u003E\n\u003Cp\u003EStatus Messages Logo by \u003Ca href=\u0022https:\/\/www.drupal.org\/u\/grienauer\u0022 rel=\u0022nofollow\u0022\u003ENico Grienauer (Grienauer)\u003C\/a\u003E\u003C\/p\u003E\n\u003Ch3 id=\u0022want-to-support-the-development-of-this-project\u0022\u003EWant to support the development of this project?\u003C\/h3\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.buymeacoffee.com\/neslee\u0022 rel=\u0022nofollow\u0022\u003EBuy me a coffee \u2615\ufe0f\u003C\/a\u003E\u003C\/p\u003E\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\u003C\/div\u003E","summary":""},"field_active_installs":"{\u00228.x-2.x\u0022:5,\u00228.x-4.x\u0022:1722}","field_active_installs_total":1727,"field_composer_namespace":"drupal\/status_messages","field_core_semver_maximum":12000000,"field_core_semver_minimum":8000000,"field_issue_summary_template":null,"field_logo_url":null,"field_project_has_releases":true,"field_project_machine_name":"status_messages","field_security_advisory_coverage":"covered"},"relationships":{"uid":{"data":{"type":"user--user","id":"b4fede92-954d-4456-a20e-61dd14401155","meta":{"drupal_internal__target_id":3580850}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6dc3aa24-eb6f-4ccd-854d-c08303bf15f1\/uid?resourceVersion=id%3A20048919"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6dc3aa24-eb6f-4ccd-854d-c08303bf15f1\/relationships\/uid?resourceVersion=id%3A20048919"}}},"field_development_status":{"data":{"type":"taxonomy_term--development_status","id":"e767288c-9800-4fb4-aeb8-8c311533838a","meta":{"drupal_internal__target_id":27274}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6dc3aa24-eb6f-4ccd-854d-c08303bf15f1\/field_development_status?resourceVersion=id%3A20048919"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6dc3aa24-eb6f-4ccd-854d-c08303bf15f1\/relationships\/field_development_status?resourceVersion=id%3A20048919"}}},"field_maintenance_status":{"data":{"type":"taxonomy_term--maintenance_status","id":"089406ad-304d-4737-80d1-2f08527ae49e","meta":{"drupal_internal__target_id":27271}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6dc3aa24-eb6f-4ccd-854d-c08303bf15f1\/field_maintenance_status?resourceVersion=id%3A20048919"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6dc3aa24-eb6f-4ccd-854d-c08303bf15f1\/relationships\/field_maintenance_status?resourceVersion=id%3A20048919"}}},"field_module_categories":{"data":[{"type":"taxonomy_term--module_categories","id":"3df293b3-c9a1-4232-962b-3c8169e8e6e3","meta":{"drupal_internal__target_id":203}},{"type":"taxonomy_term--module_categories","id":"abf23828-f269-4d39-8589-b731209eb154","meta":{"drupal_internal__target_id":186}},{"type":"taxonomy_term--module_categories","id":"086cebcf-200f-4c34-886e-f9921919b292","meta":{"drupal_internal__target_id":189}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6dc3aa24-eb6f-4ccd-854d-c08303bf15f1\/field_module_categories?resourceVersion=id%3A20048919"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6dc3aa24-eb6f-4ccd-854d-c08303bf15f1\/relationships\/field_module_categories?resourceVersion=id%3A20048919"}}},"field_project_images":{"data":[{"type":"file--file","id":"1b7b7c0f-ca36-4dc7-95b5-7df8211eba53","meta":{"alt":"Status Messages","title":null,"width":600,"height":600,"drupal_internal__target_id":29427}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6dc3aa24-eb6f-4ccd-854d-c08303bf15f1\/field_project_images?resourceVersion=id%3A20048919"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/6dc3aa24-eb6f-4ccd-854d-c08303bf15f1\/relationships\/field_project_images?resourceVersion=id%3A20048919"}}}}},{"type":"node--project_module","id":"ecb0148a-26bf-46c8-b022-2f77d7a2c2d0","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/ecb0148a-26bf-46c8-b022-2f77d7a2c2d0?resourceVersion=id%3A20054890"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/ecb0148a-26bf-46c8-b022-2f77d7a2c2d0?resourceVersion=rel%3Aworking-copy"}},"attributes":{"drupal_internal__nid":3345895,"status":true,"title":"DubBot","created":"2023-03-03T19:43:18+00:00","changed":"2026-04-07T05:20:02+00:00","moderation_state":null,"body":{"value":"\u003Ch3\u003EHelping you deliver an exceptional user experience.\u003C\/h3\u003E\r\n\r\nThe DubBot module for Drupal offers a comprehensive set of functionalities aimed at optimizing both the accessibility and performance of your websites.\r\n\r\nWith seamless integration, you can leverage DubBot\u2019s data to address issues related to accessibility, search engine optimization, broken links, and content quality. Helping to guarantee that your websites meet industry standards, adhere to accessibility guidelines, and provide an outstanding user experience.\r\n\r\nA range of reporting features enables you to monitor the performance of your website and gauge the effectiveness of your remediations.\r\n\r\nYou can consistently test, effectively address identified issues, and optimize your work, ensuring compliance, quality content, and an optimal user experience.\r\n\r\n\u003Ch3\u003E2.0 New Features\u003C\/h3\u003E\r\n\r\n\u003Ch4\u003EHighlighting\u003C\/h4\u003E\r\n\r\nNow the API will highlight the section where the issue is.\r\n\r\n\u003Cimg src=\u0022\/files\/dubbot-hilighting.png\u0022 alt=\u0022Highlighting example\u0022 \/\u003E\r\n\r\n\u003Ch4\u003EPermissions\u003C\/h4\u003E\r\n\r\nAdmins can now limit which tabs user roles can view. If no permissions are added, all tabs will be available.\r\n\r\n\u003Ch3\u003EAbout DubBot\u003C\/h3\u003E\r\n\r\nDubBot provides a suite of automated tests designed to improve website accessibility, SEO, identify broken links, catch spelling errors, and enforce customizable web governance rules.\r\n\r\nDubBot provides top-notch customer support with a dedicated team of CPACC-certified support specialists. \r\n\r\n\r\n\u003Ch3\u003EInstallation Guide\u003C\/h3\u003E\r\nInstallation of our Drupal module is very straightforward. \r\nContact DubBot Support at help@dubbot.com to request an embed key to get started.\r\n\r\nNext, navigate to the settings page in Drupal (\/admin\/config\/content\/dubbot\/settings), add your embed key, and select where you would like the in-page report positioned. Click Save, and you\u0027re done. Once the site is configured, you will find the Overview report at \/admin\/config\/content\/dubbot.\r\n\r\nFor more detailed instructions and visuals demonstrating the DubBot module inside Drupal, please refer to our Help Center documentation titled \u003Ca href=\u0022https:\/\/help.dubbot.com\/en\/articles\/8019025-the-dubbot-drupal-module-just-dropped\u0022 title=\u0022The DubBot Drupal Module Just Dropped!\u0022\u003EThe DubBot Drupal Module Just Dropped!\u003C\/a\u003E\r\n\r\n\r\n\u003Ch3\u003EDubBot Page Display\u003C\/h3\u003E\r\n\u003Cimg src=\u0022\/files\/PastedGraphic-1.png\u0022 alt=\u0022DubBot page view\u0022 \/\u003E\r\n\r\n\u003Ch3\u003EDubBot Admin Overview\u003C\/h3\u003E\r\n\u003Cimg src=\u0022\/files\/dubbot-overview.png\u0022 alt=\u0022DubBot Admin Overview\u0022 \/\u003E","format":"1","processed":"\u003Cdiv class=\u0022toc-filter\u0022\u003E\u003Ch3 id=\u0022helping-you-deliver-an-exceptional-user-experience\u0022\u003EHelping you deliver an exceptional user experience.\u003C\/h3\u003E\n\u003Cp\u003EThe DubBot module for Drupal offers a comprehensive set of functionalities aimed at optimizing both the accessibility and performance of your websites.\u003C\/p\u003E\n\u003Cp\u003EWith seamless integration, you can leverage DubBot\u2019s data to address issues related to accessibility, search engine optimization, broken links, and content quality. Helping to guarantee that your websites meet industry standards, adhere to accessibility guidelines, and provide an outstanding user experience.\u003C\/p\u003E\n\u003Cp\u003EA range of reporting features enables you to monitor the performance of your website and gauge the effectiveness of your remediations.\u003C\/p\u003E\n\u003Cp\u003EYou can consistently test, effectively address identified issues, and optimize your work, ensuring compliance, quality content, and an optimal user experience.\u003C\/p\u003E\n\u003Ch3 id=\u00220-new-features\u0022\u003E2.0 New Features\u003C\/h3\u003E\n\u003Ch4 id=\u0022highlighting\u0022\u003EHighlighting\u003C\/h4\u003E\n\u003Cp\u003ENow the API will highlight the section where the issue is.\u003C\/p\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/core\/misc\/icons\/e32700\/error.svg\u0022 alt=\u0022Image removed.\u0022 title=\u0022This image has been removed. For security reasons, only images from the local domain are allowed.\u0022 height=\u002216\u0022 width=\u002216\u0022 class=\u0022filter-image-invalid\u0022\u003E\u003C\/p\u003E\n\u003Ch4 id=\u0022permissions\u0022\u003EPermissions\u003C\/h4\u003E\n\u003Cp\u003EAdmins can now limit which tabs user roles can view. If no permissions are added, all tabs will be available.\u003C\/p\u003E\n\u003Ch3 id=\u0022about-dubbot\u0022\u003EAbout DubBot\u003C\/h3\u003E\n\u003Cp\u003EDubBot provides a suite of automated tests designed to improve website accessibility, SEO, identify broken links, catch spelling errors, and enforce customizable web governance rules.\u003C\/p\u003E\n\u003Cp\u003EDubBot provides top-notch customer support with a dedicated team of CPACC-certified support specialists. \u003C\/p\u003E\n\u003Ch3 id=\u0022installation-guide\u0022\u003EInstallation Guide\u003C\/h3\u003E\n\u003Cp\u003EInstallation of our Drupal module is very straightforward.\u003Cbr\u003E\nContact DubBot Support at \u003Ca href=\u0022mailto:help@dubbot.com\u0022 rel=\u0022nofollow\u0022\u003Ehelp@dubbot.com\u003C\/a\u003E to request an embed key to get started.\u003C\/p\u003E\n\u003Cp\u003ENext, navigate to the settings page in Drupal (\/admin\/config\/content\/dubbot\/settings), add your embed key, and select where you would like the in-page report positioned. Click Save, and you\u0027re done. Once the site is configured, you will find the Overview report at \/admin\/config\/content\/dubbot.\u003C\/p\u003E\n\u003Cp\u003EFor more detailed instructions and visuals demonstrating the DubBot module inside Drupal, please refer to our Help Center documentation titled \u003Ca href=\u0022https:\/\/help.dubbot.com\/en\/articles\/8019025-the-dubbot-drupal-module-just-dropped\u0022 rel=\u0022nofollow\u0022\u003EThe DubBot Drupal Module Just Dropped!\u003C\/a\u003E\u003C\/p\u003E\n\u003Ch3 id=\u0022dubbot-page-display\u0022\u003EDubBot Page Display\u003C\/h3\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/core\/misc\/icons\/e32700\/error.svg\u0022 alt=\u0022Image removed.\u0022 title=\u0022This image has been removed. For security reasons, only images from the local domain are allowed.\u0022 height=\u002216\u0022 width=\u002216\u0022 class=\u0022filter-image-invalid\u0022\u003E\u003C\/p\u003E\n\u003Ch3 id=\u0022dubbot-admin-overview\u0022\u003EDubBot Admin Overview\u003C\/h3\u003E\n\u003Cp\u003E\u003Cimg src=\u0022\/core\/misc\/icons\/e32700\/error.svg\u0022 alt=\u0022Image removed.\u0022 title=\u0022This image has been removed. For security reasons, only images from the local domain are allowed.\u0022 height=\u002216\u0022 width=\u002216\u0022 class=\u0022filter-image-invalid\u0022\u003E\u003C\/p\u003E\u003Ca href=\u0022#top\u0022 class=\u0022back-to-top\u0022\u003EBack to top\u003C\/a\u003E\u003C\/div\u003E","summary":"DubBot optimizes website performance by providing automated tests for accessibility, SEO, broken links, and content quality, with enhanced API highlighting and granular user permissions."},"field_active_installs":"{\u00221.0.x\u0022:104,\u00222.0.x\u0022:1384}","field_active_installs_total":1488,"field_composer_namespace":"drupal\/dubbot","field_core_semver_maximum":12000000,"field_core_semver_minimum":9000000,"field_issue_summary_template":null,"field_logo_url":{"uri":"https:\/\/git.drupalcode.org\/project\/dubbot\/-\/avatar","title":null,"options":[]},"field_project_has_releases":true,"field_project_machine_name":"dubbot","field_security_advisory_coverage":"covered"},"relationships":{"uid":{"data":{"type":"user--user","id":"3400b2e3-b6b4-4423-8513-c508c145f84c","meta":{"drupal_internal__target_id":72958}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/ecb0148a-26bf-46c8-b022-2f77d7a2c2d0\/uid?resourceVersion=id%3A20054890"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/ecb0148a-26bf-46c8-b022-2f77d7a2c2d0\/relationships\/uid?resourceVersion=id%3A20054890"}}},"field_development_status":{"data":{"type":"taxonomy_term--development_status","id":"e767288c-9800-4fb4-aeb8-8c311533838a","meta":{"drupal_internal__target_id":27274}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/ecb0148a-26bf-46c8-b022-2f77d7a2c2d0\/field_development_status?resourceVersion=id%3A20054890"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/ecb0148a-26bf-46c8-b022-2f77d7a2c2d0\/relationships\/field_development_status?resourceVersion=id%3A20054890"}}},"field_maintenance_status":{"data":{"type":"taxonomy_term--maintenance_status","id":"089406ad-304d-4737-80d1-2f08527ae49e","meta":{"drupal_internal__target_id":27271}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/ecb0148a-26bf-46c8-b022-2f77d7a2c2d0\/field_maintenance_status?resourceVersion=id%3A20054890"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/ecb0148a-26bf-46c8-b022-2f77d7a2c2d0\/relationships\/field_maintenance_status?resourceVersion=id%3A20054890"}}},"field_module_categories":{"data":[{"type":"taxonomy_term--module_categories","id":"3df293b3-c9a1-4232-962b-3c8169e8e6e3","meta":{"drupal_internal__target_id":203}},{"type":"taxonomy_term--module_categories","id":"86237004-3801-40cf-96b5-fe7d60efccb5","meta":{"drupal_internal__target_id":187}},{"type":"taxonomy_term--module_categories","id":"01df2105-2397-4a0e-b34c-80da1c3b1208","meta":{"drupal_internal__target_id":201}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/ecb0148a-26bf-46c8-b022-2f77d7a2c2d0\/field_module_categories?resourceVersion=id%3A20054890"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/ecb0148a-26bf-46c8-b022-2f77d7a2c2d0\/relationships\/field_module_categories?resourceVersion=id%3A20054890"}}},"field_project_images":{"data":[{"type":"file--file","id":"0b510593-919f-472a-b9a2-ef090c6bcb39","meta":{"alt":"DubBot Logo","title":null,"width":373,"height":469,"drupal_internal__target_id":34824}}],"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/ecb0148a-26bf-46c8-b022-2f77d7a2c2d0\/field_project_images?resourceVersion=id%3A20054890"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/node\/project_module\/ecb0148a-26bf-46c8-b022-2f77d7a2c2d0\/relationships\/field_project_images?resourceVersion=id%3A20054890"}}}}}],"included":[{"type":"taxonomy_term--module_categories","id":"3df293b3-c9a1-4232-962b-3c8169e8e6e3","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/3df293b3-c9a1-4232-962b-3c8169e8e6e3?resourceVersion=id%3A203"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/3df293b3-c9a1-4232-962b-3c8169e8e6e3?resourceVersion=rel%3Aworking-copy"}},"attributes":{"name":"Accessibility","drupal_internal__tid":203,"status":true,"description":{"value":"Enhance the site to provide a great user experience to the broadest range of people or help to audit for compliance with accessibility standards like the Web Content Accessibility Guidelines (WCAG).","format":"1","processed":"\u003Cp\u003EEnhance the site to provide a great user experience to the broadest range of people or help to audit for compliance with accessibility standards like the Web Content Accessibility Guidelines (WCAG).\u003C\/p\u003E"}}},{"type":"taxonomy_term--module_categories","id":"86237004-3801-40cf-96b5-fe7d60efccb5","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/86237004-3801-40cf-96b5-fe7d60efccb5?resourceVersion=id%3A187"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/86237004-3801-40cf-96b5-fe7d60efccb5?resourceVersion=rel%3Aworking-copy"}},"attributes":{"name":"Content editing experience","drupal_internal__tid":187,"status":true,"description":{"value":"Enhance the editorial interface and improve the processes and workflows around creating, editing or removing content.","format":"1","processed":"\u003Cp\u003EEnhance the editorial interface and improve the processes and workflows around creating, editing or removing content.\u003C\/p\u003E"}}},{"type":"taxonomy_term--module_categories","id":"01df2105-2397-4a0e-b34c-80da1c3b1208","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/01df2105-2397-4a0e-b34c-80da1c3b1208?resourceVersion=id%3A201"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/01df2105-2397-4a0e-b34c-80da1c3b1208?resourceVersion=rel%3Aworking-copy"}},"attributes":{"name":"Search engine optimization (SEO)","drupal_internal__tid":201,"status":true,"description":{"value":"Manage or improve the site\u0027s search engine ranking by running audits, assessing metrics, or making the site\u2019s content and data more digestible by search engines.","format":"1","processed":"\u003Cp\u003EManage or improve the site\u0027s search engine ranking by running audits, assessing metrics, or making the site\u2019s content and data more digestible by search engines.\u003C\/p\u003E"}}},{"type":"taxonomy_term--module_categories","id":"086cebcf-200f-4c34-886e-f9921919b292","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/086cebcf-200f-4c34-886e-f9921919b292?resourceVersion=id%3A189"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/086cebcf-200f-4c34-886e-f9921919b292?resourceVersion=rel%3Aworking-copy"}},"attributes":{"name":"Developer tools","drupal_internal__tid":189,"status":true,"description":{"value":"Empower developers with tools that assist with developing and debugging the frontend or backend of the site.","format":"1","processed":"\u003Cp\u003EEmpower developers with tools that assist with developing and debugging the frontend or backend of the site.\u003C\/p\u003E"}}},{"type":"taxonomy_term--module_categories","id":"68428c33-1db7-438d-b1b3-e23004e0982b","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/68428c33-1db7-438d-b1b3-e23004e0982b?resourceVersion=id%3A192"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/68428c33-1db7-438d-b1b3-e23004e0982b?resourceVersion=rel%3Aworking-copy"}},"attributes":{"name":"Media","drupal_internal__tid":192,"status":true,"description":{"value":"Enhance functionality related to media, or expand media resource types, such as images, videos, audio files, or documents.","format":"1","processed":"\u003Cp\u003EEnhance functionality related to media, or expand media resource types, such as images, videos, audio files, or documents.\u003C\/p\u003E"}}},{"type":"taxonomy_term--module_categories","id":"754c04cb-6da2-42ba-9032-d64307f68f45","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/754c04cb-6da2-42ba-9032-d64307f68f45?resourceVersion=id%3A188"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/754c04cb-6da2-42ba-9032-d64307f68f45?resourceVersion=rel%3Aworking-copy"}},"attributes":{"name":"Content display","drupal_internal__tid":188,"status":true,"description":{"value":"Configure the layout and format of content and data presented to site visitors.","format":"1","processed":"\u003Cp\u003EConfigure the layout and format of content and data presented to site visitors.\u003C\/p\u003E"}}},{"type":"taxonomy_term--module_categories","id":"dcb48e9f-6afa-4842-8ef6-44b90b083fcc","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/dcb48e9f-6afa-4842-8ef6-44b90b083fcc?resourceVersion=id%3A200"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/dcb48e9f-6afa-4842-8ef6-44b90b083fcc?resourceVersion=rel%3Aworking-copy"}},"attributes":{"name":"Site structure","drupal_internal__tid":200,"status":true,"description":{"value":"Extend the structure of the site by way of content models, data storage, field types, and navigation, so it is more understandable to users.","format":"1","processed":"\u003Cp\u003EExtend the structure of the site by way of content models, data storage, field types, and navigation, so it is more understandable to users.\u003C\/p\u003E"}}},{"type":"taxonomy_term--module_categories","id":"d1322ab4-e2be-4f21-9e01-8c19b3da8bea","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/d1322ab4-e2be-4f21-9e01-8c19b3da8bea?resourceVersion=id%3A197"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/d1322ab4-e2be-4f21-9e01-8c19b3da8bea?resourceVersion=rel%3Aworking-copy"}},"attributes":{"name":"Performance","drupal_internal__tid":197,"status":true,"description":{"value":"Improve the real or perceived speed of the site, or monitor performance metrics.","format":"1","processed":"\u003Cp\u003EImprove the real or perceived speed of the site, or monitor performance metrics.\u003C\/p\u003E"}}},{"type":"taxonomy_term--module_categories","id":"abf23828-f269-4d39-8589-b731209eb154","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/abf23828-f269-4d39-8589-b731209eb154?resourceVersion=id%3A186"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/module_categories\/abf23828-f269-4d39-8589-b731209eb154?resourceVersion=rel%3Aworking-copy"}},"attributes":{"name":"Administration tools","drupal_internal__tid":186,"status":true,"description":{"value":"Empower site builders and administrators with no-code tools to setup, enhance, configure, or maintain the site.","format":"1","processed":"\u003Cp\u003EEmpower site builders and administrators with no-code tools to setup, enhance, configure, or maintain the site.\u003C\/p\u003E"}}},{"type":"taxonomy_term--maintenance_status","id":"089406ad-304d-4737-80d1-2f08527ae49e","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/maintenance_status\/089406ad-304d-4737-80d1-2f08527ae49e?resourceVersion=id%3A27271"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/maintenance_status\/089406ad-304d-4737-80d1-2f08527ae49e?resourceVersion=rel%3Aworking-copy"}},"attributes":{"drupal_internal__tid":27271,"status":true,"name":"Actively maintained","description":{"value":"Maintainers strive to actively monitor issues and respond in a timely manner.","format":"1","processed":"\u003Cp\u003EMaintainers strive to actively monitor issues and respond in a timely manner.\u003C\/p\u003E"}}},{"type":"taxonomy_term--development_status","id":"e767288c-9800-4fb4-aeb8-8c311533838a","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/development_status\/e767288c-9800-4fb4-aeb8-8c311533838a?resourceVersion=id%3A27274"},"working-copy":{"href":"https:\/\/new.drupal.org\/jsonapi\/taxonomy_term\/development_status\/e767288c-9800-4fb4-aeb8-8c311533838a?resourceVersion=rel%3Aworking-copy"}},"attributes":{"drupal_internal__tid":27274,"status":true,"name":"Under active development","description":{"value":"This project is under active development.","format":"1","processed":"\u003Cp\u003EThis project is under active development.\u003C\/p\u003E"}}},{"type":"user--user","id":"ebd9c743-897d-4c43-aaf8-b9e1acfe8e26","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/ebd9c743-897d-4c43-aaf8-b9e1acfe8e26"}},"attributes":{"display_name":"itmaybejj","drupal_internal__uid":1177504,"name":"itmaybejj","field_country":"US","field_first_name":"John","field_git_username":"itmaybejj","field_last_name":"Jameson"},"relationships":{"user_picture":{"data":{"type":"file--file","id":"7b57a1cb-8bc5-4934-9cc1-64e155a7cf1d","meta":{"alt":null,"title":null,"width":627,"height":627,"drupal_internal__target_id":102595}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/ebd9c743-897d-4c43-aaf8-b9e1acfe8e26\/user_picture"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/ebd9c743-897d-4c43-aaf8-b9e1acfe8e26\/relationships\/user_picture"}}}}},{"type":"user--user","id":"e8a182f9-9f1d-4273-9720-93a6d64fc697","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/e8a182f9-9f1d-4273-9720-93a6d64fc697"}},"attributes":{"display_name":"ahana92","drupal_internal__uid":3494063,"name":"ahana92","field_country":"IN","field_first_name":"Ahana","field_git_username":"ahana92","field_last_name":"Kundu"},"relationships":{"user_picture":{"data":null,"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/e8a182f9-9f1d-4273-9720-93a6d64fc697\/user_picture"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/e8a182f9-9f1d-4273-9720-93a6d64fc697\/relationships\/user_picture"}}}}},{"type":"user--user","id":"f2e2ea48-c23d-401f-a3c2-a7b2985bb613","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/f2e2ea48-c23d-401f-a3c2-a7b2985bb613"}},"attributes":{"display_name":"smustgrave","drupal_internal__uid":3252890,"name":"smustgrave","field_country":"US","field_first_name":"Stephen","field_git_username":"smustgrave","field_last_name":"Mustgrave"},"relationships":{"user_picture":{"data":{"type":"file--file","id":"a64d1b62-3e77-4c1f-b54b-bf33c1dd99d5","meta":{"alt":null,"title":null,"width":768,"height":1024,"drupal_internal__target_id":753451}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/f2e2ea48-c23d-401f-a3c2-a7b2985bb613\/user_picture"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/f2e2ea48-c23d-401f-a3c2-a7b2985bb613\/relationships\/user_picture"}}}}},{"type":"user--user","id":"33d5f6fe-142c-475b-abf6-656b0c581540","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/33d5f6fe-142c-475b-abf6-656b0c581540"}},"attributes":{"display_name":"marcus_johansson","drupal_internal__uid":385947,"name":"marcus_johansson","field_country":"DE","field_first_name":"Marcus","field_git_username":"Marcus_Johansson","field_last_name":"Johansson"},"relationships":{"user_picture":{"data":{"type":"file--file","id":"5d85626e-8520-4faa-b638-3b8977d8537e","meta":{"alt":null,"title":null,"width":196,"height":196,"drupal_internal__target_id":746882}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/33d5f6fe-142c-475b-abf6-656b0c581540\/user_picture"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/33d5f6fe-142c-475b-abf6-656b0c581540\/relationships\/user_picture"}}}}},{"type":"user--user","id":"e3e4aacb-139d-4d91-b390-0134be3b5c8b","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/e3e4aacb-139d-4d91-b390-0134be3b5c8b"}},"attributes":{"display_name":"siteimprove","drupal_internal__uid":3521441,"name":"siteimprove","field_country":"DK","field_first_name":null,"field_git_username":"Siteimprove","field_last_name":null},"relationships":{"user_picture":{"data":{"type":"file--file","id":"5b931b84-56b8-4806-a76b-32d9c190fc11","meta":{"alt":null,"title":null,"width":170,"height":170,"drupal_internal__target_id":756880}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/e3e4aacb-139d-4d91-b390-0134be3b5c8b\/user_picture"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/e3e4aacb-139d-4d91-b390-0134be3b5c8b\/relationships\/user_picture"}}}}},{"type":"user--user","id":"885dfa93-5450-46e4-a7de-dbb359eaf9cb","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/885dfa93-5450-46e4-a7de-dbb359eaf9cb"}},"attributes":{"display_name":"mpdonadio","drupal_internal__uid":325244,"name":"mpdonadio","field_country":"US","field_first_name":"Matthew","field_git_username":"matthew.donadio","field_last_name":"Donadio"},"relationships":{"user_picture":{"data":{"type":"file--file","id":"91f6b906-c961-4a36-a3bd-dd71c094c49c","meta":{"alt":null,"title":null,"width":1024,"height":1024,"drupal_internal__target_id":65629}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/885dfa93-5450-46e4-a7de-dbb359eaf9cb\/user_picture"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/885dfa93-5450-46e4-a7de-dbb359eaf9cb\/relationships\/user_picture"}}}}},{"type":"user--user","id":"d6052c61-dbd3-4f7b-90b6-d96142308e98","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/d6052c61-dbd3-4f7b-90b6-d96142308e98"}},"attributes":{"display_name":"bkosborne","drupal_internal__uid":788032,"name":"bkosborne","field_country":"US","field_first_name":"Brian","field_git_username":"bkosborne","field_last_name":"Osborne"},"relationships":{"user_picture":{"data":{"type":"file--file","id":"af08499c-51e1-4376-a172-7215c2c1c3f7","meta":{"alt":null,"title":null,"width":1024,"height":1024,"drupal_internal__target_id":205975}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/d6052c61-dbd3-4f7b-90b6-d96142308e98\/user_picture"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/d6052c61-dbd3-4f7b-90b6-d96142308e98\/relationships\/user_picture"}}}}},{"type":"user--user","id":"b838d119-25c6-44b2-adc2-372e8a8b87cd","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/b838d119-25c6-44b2-adc2-372e8a8b87cd"}},"attributes":{"display_name":"luke.leber","drupal_internal__uid":3509746,"name":"luke.leber","field_country":"US","field_first_name":"Luke","field_git_username":"lleber","field_last_name":"Leber"},"relationships":{"user_picture":{"data":{"type":"file--file","id":"437feffb-fe1b-47d3-b58a-9460db6e6bf6","meta":{"alt":null,"title":null,"width":1024,"height":1024,"drupal_internal__target_id":150593}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/b838d119-25c6-44b2-adc2-372e8a8b87cd\/user_picture"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/b838d119-25c6-44b2-adc2-372e8a8b87cd\/relationships\/user_picture"}}}}},{"type":"user--user","id":"92fc198c-6cdd-4353-9689-ee069cf5805e","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/92fc198c-6cdd-4353-9689-ee069cf5805e"}},"attributes":{"display_name":"alexander.levitsky","drupal_internal__uid":3558183,"name":"alexander.levitsky","field_country":"TR","field_first_name":"Alexander","field_git_username":"alexander.levitsky","field_last_name":"Levitsky"},"relationships":{"user_picture":{"data":{"type":"file--file","id":"3f5cf6cb-2b33-4242-87e2-58e236705df6","meta":{"alt":null,"title":null,"width":1024,"height":682,"drupal_internal__target_id":150143}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/92fc198c-6cdd-4353-9689-ee069cf5805e\/user_picture"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/92fc198c-6cdd-4353-9689-ee069cf5805e\/relationships\/user_picture"}}}}},{"type":"user--user","id":"f97fd29f-58b6-48bb-871a-ba8d3f89e800","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/f97fd29f-58b6-48bb-871a-ba8d3f89e800"}},"attributes":{"display_name":"bronzehedwick","drupal_internal__uid":409665,"name":"bronzehedwick","field_country":"US","field_first_name":"Chris","field_git_username":"bronzehedwick","field_last_name":"DeLuca"},"relationships":{"user_picture":{"data":{"type":"file--file","id":"cb6bad31-61e1-474e-93e3-d5f0a34b151f","meta":{"alt":null,"title":null,"width":200,"height":200,"drupal_internal__target_id":147355}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/f97fd29f-58b6-48bb-871a-ba8d3f89e800\/user_picture"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/f97fd29f-58b6-48bb-871a-ba8d3f89e800\/relationships\/user_picture"}}}}},{"type":"user--user","id":"b4fede92-954d-4456-a20e-61dd14401155","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/b4fede92-954d-4456-a20e-61dd14401155"}},"attributes":{"display_name":"neslee canil pinto","drupal_internal__uid":3580850,"name":"neslee canil pinto","field_country":"NO","field_first_name":"Neslee Canil","field_git_username":"NesleeCanilPinto","field_last_name":"Pinto"},"relationships":{"user_picture":{"data":{"type":"file--file","id":"acde2628-391c-43cc-82be-741152d0bdf2","meta":{"alt":null,"title":null,"width":623,"height":701,"drupal_internal__target_id":196468}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/b4fede92-954d-4456-a20e-61dd14401155\/user_picture"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/b4fede92-954d-4456-a20e-61dd14401155\/relationships\/user_picture"}}}}},{"type":"user--user","id":"3400b2e3-b6b4-4423-8513-c508c145f84c","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/3400b2e3-b6b4-4423-8513-c508c145f84c"}},"attributes":{"display_name":"davidburns","drupal_internal__uid":72958,"name":"davidburns","field_country":"US","field_first_name":"David","field_git_username":"davidburns","field_last_name":"Burns"},"relationships":{"user_picture":{"data":{"type":"file--file","id":"01a52467-d15c-488c-b4a3-68ea1159ab7b","meta":{"alt":null,"title":null,"width":820,"height":1000,"drupal_internal__target_id":30282}},"links":{"related":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/3400b2e3-b6b4-4423-8513-c508c145f84c\/user_picture"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/user\/user\/3400b2e3-b6b4-4423-8513-c508c145f84c\/relationships\/user_picture"}}}}},{"type":"file--file","id":"03315b7d-1050-4e55-9447-0ea166a500c3","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/file\/file\/03315b7d-1050-4e55-9447-0ea166a500c3"}},"attributes":{"uri":{"value":"public:\/\/project-images\/Screenshot from 2020-08-26 18-06-53.png","url":"\/assets\/project-images\/Screenshot%20from%202020-08-26%2018-06-53.png"}}},{"type":"file--file","id":"b713ecbe-9331-4ac5-a08e-2c31f5cb255b","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/file\/file\/b713ecbe-9331-4ac5-a08e-2c31f5cb255b"}},"attributes":{"uri":{"value":"public:\/\/project-images\/Screenshot from 2020-08-26 18-06-38.png","url":"\/assets\/project-images\/Screenshot%20from%202020-08-26%2018-06-38.png"}}},{"type":"file--file","id":"98f55b60-1b67-411a-bdcf-761c654d3b91","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/file\/file\/98f55b60-1b67-411a-bdcf-761c654d3b91"}},"attributes":{"uri":{"value":"public:\/\/project-images\/ai_alt_image_text.png","url":"\/assets\/project-images\/ai_alt_image_text.png"}}},{"type":"file--file","id":"daabda23-e2df-41f2-885b-6b3ae2b4eb43","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/file\/file\/daabda23-e2df-41f2-885b-6b3ae2b4eb43"}},"attributes":{"uri":{"value":"public:\/\/project-images\/siteimprove-cms-plugin-live-page_1.png","url":"\/assets\/project-images\/siteimprove-cms-plugin-live-page_1.png"}}},{"type":"file--file","id":"0048fc5b-133d-41a3-902c-32dd818db6c9","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/file\/file\/0048fc5b-133d-41a3-902c-32dd818db6c9"}},"attributes":{"uri":{"value":"public:\/\/project-images\/mobile_detect_0.png","url":"\/assets\/project-images\/mobile_detect_0.png"}}},{"type":"file--file","id":"49c8a6cc-dcb9-4038-91ee-448a6c3dda50","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/file\/file\/49c8a6cc-dcb9-4038-91ee-448a6c3dda50"}},"attributes":{"uri":{"value":"public:\/\/project-images\/mobile_detect_2.png","url":"\/assets\/project-images\/mobile_detect_2.png"}}},{"type":"file--file","id":"e5acbd7a-78ed-46ab-8104-62919169d6fe","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/file\/file\/e5acbd7a-78ed-46ab-8104-62919169d6fe"}},"attributes":{"uri":{"value":"public:\/\/project-images\/Screen Shot 2021-01-16 at 12.59.54 PM.png","url":"\/assets\/project-images\/Screen%20Shot%202021-01-16%20at%2012.59.54%20PM.png"}}},{"type":"file--file","id":"bfb0e572-38b2-49e9-ba74-97c8247e3158","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/file\/file\/bfb0e572-38b2-49e9-ba74-97c8247e3158"}},"attributes":{"uri":{"value":"public:\/\/project-images\/snapshot_753.png","url":"\/assets\/project-images\/snapshot_753.png"}}},{"type":"file--file","id":"3d8b01fc-bdfc-4748-864f-60a51c1587de","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/file\/file\/3d8b01fc-bdfc-4748-864f-60a51c1587de"}},"attributes":{"uri":{"value":"public:\/\/project-images\/snapshot_312.png","url":"\/assets\/project-images\/snapshot_312.png"}}},{"type":"file--file","id":"d245efd1-1031-405a-98d6-fda75f375c7c","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/file\/file\/d245efd1-1031-405a-98d6-fda75f375c7c"}},"attributes":{"uri":{"value":"public:\/\/project-images\/snapshot_313.png","url":"\/assets\/project-images\/snapshot_313.png"}}},{"type":"file--file","id":"ad7d430e-3bda-4f74-b2ba-a0bfd2346dee","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/file\/file\/ad7d430e-3bda-4f74-b2ba-a0bfd2346dee"}},"attributes":{"uri":{"value":"public:\/\/project-images\/javi-er 2024-08-08 a la(s) 4.18.00\u202fp.\u00a0m..png","url":"\/assets\/project-images\/javi-er%202024-08-08%20a%20la%28s%29%204.18.00%E2%80%AFp.%C2%A0m..png"}}},{"type":"file--file","id":"cc3665be-4de1-4428-8b48-be7306f79d20","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/file\/file\/cc3665be-4de1-4428-8b48-be7306f79d20"}},"attributes":{"uri":{"value":"public:\/\/project-images\/javi-er 2024-08-08 a la(s) 5.20.50\u202fp.\u00a0m..png","url":"\/assets\/project-images\/javi-er%202024-08-08%20a%20la%28s%29%205.20.50%E2%80%AFp.%C2%A0m..png"}}},{"type":"file--file","id":"1b7b7c0f-ca36-4dc7-95b5-7df8211eba53","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/file\/file\/1b7b7c0f-ca36-4dc7-95b5-7df8211eba53"}},"attributes":{"uri":{"value":"public:\/\/project-images\/drupal-module-messages-logo.jpg","url":"\/assets\/project-images\/drupal-module-messages-logo.jpg"}}},{"type":"file--file","id":"0b510593-919f-472a-b9a2-ef090c6bcb39","links":{"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/file\/file\/0b510593-919f-472a-b9a2-ef090c6bcb39"}},"attributes":{"uri":{"value":"public:\/\/project-images\/Dubbot_Logo.png","url":"\/assets\/project-images\/Dubbot_Logo.png"}}}],"meta":{"count":304},"links":{"last":{"href":"https:\/\/new.drupal.org\/jsonapi\/index\/project_modules?filter%5Bstatus%5D=1\u0026filter%5Btype%5D=project_module\u0026filter%5Bproject_type%5D=full\u0026filter%5Bmodule_categories_uuid%5D%5Bvalue%5D%5B0%5D=3df293b3-c9a1-4232-962b-3c8169e8e6e3\u0026filter%5Bmodule_categories_uuid%5D%5Boperator%5D=IN\u0026filter%5Bmodule_categories_uuid%5D%5Bpath%5D=module_categories_uuid\u0026filter%5Bn_security_coverage%5D%5Bvalue%5D%5B0%5D=revoked\u0026filter%5Bn_security_coverage%5D%5Boperator%5D=NOT%20IN\u0026filter%5Bn_security_coverage%5D%5Bpath%5D=security_coverage\u0026page%5Boffset%5D=300\u0026page%5Blimit%5D=12\u0026include=field_module_categories%2Cfield_maintenance_status%2Cfield_development_status%2Cuid%2Cfield_project_images"},"next":{"href":"https:\/\/new.drupal.org\/jsonapi\/index\/project_modules?filter%5Bstatus%5D=1\u0026filter%5Btype%5D=project_module\u0026filter%5Bproject_type%5D=full\u0026filter%5Bmodule_categories_uuid%5D%5Bvalue%5D%5B0%5D=3df293b3-c9a1-4232-962b-3c8169e8e6e3\u0026filter%5Bmodule_categories_uuid%5D%5Boperator%5D=IN\u0026filter%5Bmodule_categories_uuid%5D%5Bpath%5D=module_categories_uuid\u0026filter%5Bn_security_coverage%5D%5Bvalue%5D%5B0%5D=revoked\u0026filter%5Bn_security_coverage%5D%5Boperator%5D=NOT%20IN\u0026filter%5Bn_security_coverage%5D%5Bpath%5D=security_coverage\u0026page%5Boffset%5D=12\u0026page%5Blimit%5D=12\u0026include=field_module_categories%2Cfield_maintenance_status%2Cfield_development_status%2Cuid%2Cfield_project_images"},"self":{"href":"https:\/\/new.drupal.org\/jsonapi\/index\/project_modules?filter%5Bstatus%5D=1\u0026filter%5Btype%5D=project_module\u0026filter%5Bproject_type%5D=full\u0026filter%5Bmodule_categories_uuid%5D%5Bvalue%5D%5B0%5D=3df293b3-c9a1-4232-962b-3c8169e8e6e3\u0026filter%5Bmodule_categories_uuid%5D%5Boperator%5D=IN\u0026filter%5Bmodule_categories_uuid%5D%5Bpath%5D=module_categories_uuid\u0026filter%5Bn_security_coverage%5D%5Bvalue%5D%5B0%5D=revoked\u0026filter%5Bn_security_coverage%5D%5Boperator%5D=NOT%20IN\u0026filter%5Bn_security_coverage%5D%5Bpath%5D=security_coverage\u0026include=field_module_categories%2Cfield_maintenance_status%2Cfield_development_status%2Cuid%2Cfield_project_images\u0026page%5Blimit%5D=12\u0026page%5Boffset%5D=0"}}}