{"id":1878872,"date":"2023-04-10T07:39:50","date_gmt":"2023-04-10T14:39:50","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=1878872"},"modified":"2024-10-24T15:07:33","modified_gmt":"2024-10-24T22:07:33","slug":"build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system","title":{"rendered":"Build accessible web apps with ArcGIS Maps SDK for JavaScript and Calcite Design System"},"author":309572,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[738191],"tags":[28911,769562,759512,706381],"industry":[],"product":[36831,36601],"class_list":["post-1878872","blog","type-blog","status-publish","format-standard","hentry","category-developers","tag-accessibility","tag-arcgis-maps-sdk-for-javascript","tag-calcite-design-system","tag-web-accessibility","product-js-api-arcgis","product-developers"],"acf":{"authors":[{"ID":309572,"user_firstname":"Kitty","user_lastname":"Hurley","nickname":"Kitty Hurley","user_nicename":"khurley","display_name":"Kitty Hurley","user_email":"khurley@esri.com","user_url":"https:\/\/www.github.com\/geospatialem","user_registered":"2022-05-04 21:30:59","user_description":"Kitty is a Principal Product Engineer with Calcite Design System, passionate about expanding access to the web and maps for broader audiences. She is dedicated to creating inclusive, user-friendly web experiences that connect people and places through innovative design and technology. Outside of work, Kitty enjoys exploring the wilderness of Minnesota and has a goal to visit every major league baseball stadium across America.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/03\/Esri_Day2_PSCC2024_H_0127-e1710789483673-261x261.jpg' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"},{"ID":335892,"user_firstname":"Jessica","user_lastname":"Mccall","nickname":"Jessica Mccall","user_nicename":"jmccall","display_name":"Jessica McCall","user_email":"jmccall@esri.com","user_url":"","user_registered":"2023-03-24 19:40:44","user_description":"Jessica McCall is the Senior Accessibility Project Manager for the Esri Accessibility team and manages strategic planning and project management activities for the accessibility team. She also works to gather and support customer requirements for accessibility alongside product team members.  Previously, Jessica worked for a consulting firm as a project and operations manager supporting utility data migration and data integration projects between GIS and CAD-based software.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/Jessica-McCall-2023-b-465x465.jpg' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"}],"short_description":"Learn how to make your web app accessible using the JavaScript Maps SDK and Calcite.","flexible_content":[{"acf_fc_layout":"image","image":{"ID":1894992,"id":1894992,"title":"a11y-web-apps-cover","filename":"a11y-web-apps-cover.png","filesize":3052559,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/a11y-web-apps-cover.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system\/a11y-web-apps-cover","alt":"Basemap zoom focused on the city of New Braunfels, Texas.","author":"309572","description":"","caption":"","name":"a11y-web-apps-cover","status":"inherit","uploaded_to":1878872,"date":"2023-04-04 15:27:10","modified":"2024-10-24 22:06:58","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":1920,"height":1080,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/a11y-web-apps-cover-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/a11y-web-apps-cover.png","medium-width":464,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/a11y-web-apps-cover.png","medium_large-width":768,"medium_large-height":432,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/a11y-web-apps-cover.png","large-width":1920,"large-height":1080,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/a11y-web-apps-cover-1536x864.png","1536x1536-width":1536,"1536x1536-height":864,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/a11y-web-apps-cover.png","2048x2048-width":1920,"2048x2048-height":1080,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/a11y-web-apps-cover-826x465.png","card_image-width":826,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/a11y-web-apps-cover-1920x1080.png","wide_image-width":1920,"wide_image-height":1080}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h2>What is web accessibility?<\/h2>\n<p><span data-contrast=\"auto\">Web accessibility is the practice of removing barriers that <\/span><span data-contrast=\"auto\">may <\/span><span data-contrast=\"auto\">prevent people from ful<\/span><span data-contrast=\"auto\">ly experiencing content and supporting<\/span><span data-contrast=\"auto\">\u00a0inclusion <\/span><span data-contrast=\"auto\">for<\/span><span data-contrast=\"auto\"> individuals with disabilities. It can be a complex process <\/span><span data-contrast=\"auto\">to <\/span><span data-contrast=\"auto\">creat<\/span><span data-contrast=\"auto\">e<\/span><span data-contrast=\"auto\"> fully accessible <\/span><span data-contrast=\"auto\">web solutions as the <\/span><span data-contrast=\"auto\">manner of which an individual <\/span><span data-contrast=\"auto\">interact<\/span><span data-contrast=\"auto\">s<\/span><span data-contrast=\"auto\"> with <\/span><span data-contrast=\"auto\">the web can <\/span><span data-contrast=\"auto\">var<\/span><span data-contrast=\"auto\">y greatly <\/span><span data-contrast=\"auto\">from person to person<\/span><span data-contrast=\"auto\">.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">However, we can look to the <\/span><span data-contrast=\"auto\"><a href=\"https:\/\/www.w3.org\/TR\/WCAG21\/\">Web Content Accessibility Guidelines<\/a>, or WCAG, <\/span><span data-contrast=\"auto\">a<\/span><span data-contrast=\"auto\">s a <\/span><span data-contrast=\"auto\">guide to improve accessibility on the web<\/span><span data-contrast=\"auto\">. WCAG serves as<\/span> <span data-contrast=\"auto\">an <\/span><span data-contrast=\"auto\">internationally recognized coding standard, developed to meet the <\/span><span data-contrast=\"auto\">varying <\/span><span data-contrast=\"auto\">needs of individuals, organizations, and government agencies implementing web accessibility.<\/span><span data-contrast=\"auto\"> WCAG&#8217;s success <\/span><span data-contrast=\"auto\">criterion provide <\/span><span data-contrast=\"auto\">standards for developers of <\/span><span data-contrast=\"auto\">web and mobile<\/span><span data-contrast=\"auto\"> content when publishing web content or apps. <\/span><\/p>\n"},{"acf_fc_layout":"content","content":"<h2>Building accessibility into web maps<\/h2>\n<p><span data-contrast=\"auto\">Esri\u2019s commitment to accessibility is e<\/span><span data-contrast=\"auto\">vident in the development of accessible components in JavaScript Maps SDK<\/span><span data-contrast=\"auto\"> and Calcite, which<\/span><span data-contrast=\"auto\"> aim to provide building blocks to design an<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">accessible UI. <\/span><span data-contrast=\"auto\">Below are some ways to build accessi<\/span><span data-contrast=\"auto\">ble and inclusive apps with<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"auto\">JavaScript Maps SDK and Calcite.<\/span><\/p>\n"},{"acf_fc_layout":"content","content":"<h2>Color contrast<\/h2>\n<p><span class=\"TrackChangeTextInsertion TrackedChange SCXW32459816 BCX0\"><span class=\"TextRun SCXW32459816 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW32459816 BCX0\">Color contrast is key for individuals who <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange SCXW32459816 BCX0\"><span class=\"TextRun SCXW32459816 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW32459816 BCX0\">may <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange SCXW32459816 BCX0\"><span class=\"TextRun SCXW32459816 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW32459816 BCX0\">have low <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange SCXW32459816 BCX0\"><span class=\"TextRun SCXW32459816 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW32459816 BCX0\">vision, macular degeneration due to age, color vision deficiency (color blindness), or a variety of other vision-related <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange SCXW32459816 BCX0\"><span class=\"TextRun SCXW32459816 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW32459816 BCX0\">impairments. <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange SCXW32459816 BCX0\"><span class=\"TextRun SCXW32459816 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW32459816 BCX0\">Being aware of the contrast of colors or specific combinations of colors is key to creating<\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange SCXW32459816 BCX0\"><span class=\"TextRun SCXW32459816 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW32459816 BCX0\"> an accessible web app. <\/span><\/span><\/span><a href=\"https:\/\/www.w3.org\/WAI\/WCAG21\/Understanding\/contrast-minimum.html\" target=\"_blank\" rel=\"noopener\" aria-describedby=\"new-window\">WCAG Success Criterion 1.4.3: Contrast (Minimum)<\/a>\u00a0aims for a 4.5 to 1 ratio when visually presenting text and images.<\/p>\n"},{"acf_fc_layout":"content","content":"<h3>Enhanced color contrast with Calcite&#8217;s web components<\/h3>\n<p>Calcite&#8217;s colors support <a href=\"https:\/\/www.w3.org\/WAI\/WCAG21\/Understanding\/contrast-minimum.html\" target=\"_blank\" rel=\"noopener\" aria-describedby=\"new-window\">WCAG Success Criterion 1.4.3: Contrast (Minimum)<\/a>, or level AA.<\/p>\n<p>You can add further support with <a href=\"https:\/\/www.w3.org\/WAI\/WCAG21\/Understanding\/contrast-minimum.html\" target=\"_blank\" rel=\"noopener\" aria-describedby=\"new-window\">WCAG Success Criterion 1.4.6: Contrast (Enhanced)<\/a>, or level AAA, as an example, by updating the CSS variable of <code>calcite-ui-danger<\/code> to provide a contrast ratio greater than 7 to 1, where the background color is white or <code>#FFF<\/code>:<\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #000080;font-weight: normal\">body<\/span> { \r\n  <span style=\"color: #008080\">--calcite-ui-danger<\/span>: <span style=\"color: #008080\">#A92519<\/span>; \r\n}\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"image","image":{"ID":1892992,"id":1892992,"title":"Capture","filename":"Capture-1.png","filesize":6527,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/Capture-1.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system\/capture-23","alt":"Calcite's Input and Input Message components color can be modified to support higher contrast ratios for your audience.","author":"309572","description":"","caption":"Calcite's Input and Input Message components color can be modified to support higher contrast ratios for your audience.","name":"capture-23","status":"inherit","uploaded_to":1878872,"date":"2023-03-31 22:12:39","modified":"2023-03-31 22:13:11","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":743,"height":124,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/Capture-1-213x124.png","thumbnail-width":213,"thumbnail-height":124,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/Capture-1.png","medium-width":464,"medium-height":77,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/Capture-1.png","medium_large-width":743,"medium_large-height":124,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/Capture-1.png","large-width":743,"large-height":124,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/Capture-1.png","1536x1536-width":743,"1536x1536-height":124,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/Capture-1.png","2048x2048-width":743,"2048x2048-height":124,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/Capture-1.png","card_image-width":743,"card_image-height":124,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/Capture-1.png","wide_image-width":743,"wide_image-height":124}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h3>High contrast mode<\/h3>\n<p>High <span class=\"TrackChangeTextInsertion TrackedChange SCXW32459816 BCX0\"><span class=\"TextRun SCXW32459816 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW32459816 BCX0\">contrast modes can be enabled on an operating system (OS), where colors are forced and visual elements are simplified. High contrast mode supports individuals <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange SCXW32459816 BCX0\"><span class=\"TextRun SCXW32459816 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW32459816 BCX0\">who <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange SCXW32459816 BCX0\"><span class=\"TextRun SCXW32459816 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW32459816 BCX0\">may <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange SCXW32459816 BCX0\"><span class=\"TextRun SCXW32459816 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW32459816 BCX0\">have low <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange SCXW32459816 BCX0\"><span class=\"TextRun SCXW32459816 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW32459816 BCX0\">vision or are unable to distinguish shapes or details in objects.<\/span><\/span><\/span><\/p>\n"},{"acf_fc_layout":"content","content":"<h3>Add contrast to maps<\/h3>\n<p>You can add high contrast basemaps, toggle control themes, and update graphic colors to showcase solutions to a wider audience while supporting the success criterion.<\/p>\n"},{"acf_fc_layout":"storymap","title":"Toggle between high contrast basemaps","description":"<p>Switch between high contrast light and dark basemaps using the <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-widgets-BasemapToggle.html\" target=\"_blank\"><code>BasemapToggle<\/code><\/a> widget.<\/p>\n","static":false,"storymap_url":"<a href=\"https:\/\/kellyhutchins.github.io\/DevSummit2023-A11y\/demos\/HighContrastBasemapToggle.html\">https:\/\/kellyhutchins.github.io\/DevSummit2023-A11y\/demos\/HighContrastBasemapToggle.html<\/a>"},{"acf_fc_layout":"content","content":"<p>To do this, start by adding the <a href=\"https:\/\/livingatlas.arcgis.com\/en\/browse\/?q=%22Enhanced%20Contrast%20Map%22#d=2&amp;q=%22Enhanced%20Contrast%20Map%22\" target=\"_blank\" rel=\"noopener\">high contrast basemaps<\/a>\u00a0as objects:<\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #333;font-weight: bold\">const<\/span> highContrastLightBasemap = <span style=\"color: #333;font-weight: bold\">new<\/span> Basemap({\r\n  portalItem: {\r\n    id: <span style=\"color: #d14\">\"084291b0ecad4588b8c8853898d72445\"<\/span>\r\n  },\r\n  title: <span style=\"color: #d14\">\"High contrast light theme\"<\/span>,\r\n  id: <span style=\"color: #d14\">\"high-contrast-light\"<\/span>\r\n});\r\n\r\n<span style=\"color: #333;font-weight: bold\">const<\/span> highContrastDarkBasemap = <span style=\"color: #333;font-weight: bold\">new<\/span> Basemap({\r\n  portalItem: {\r\n    id: <span style=\"color: #d14\">\"3e23478909194c54992eaaee78b5f754\"<\/span>\r\n  },\r\n  title: <span style=\"color: #d14\">\"High contrast dark theme\"<\/span>,\r\n  id: <span style=\"color: #d14\">\"high-contrast-dark\"<\/span>\r\n});\r\n<\/code><\/pre>\n<p>Next, set the map\u2019s\u00a0<code><a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-Map.html#basemap\" target=\"_blank\" rel=\"noopener\">basemap<\/a><\/code>\u00a0property to the light basemap.<\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #333;font-weight: bold\">const<\/span> map = <span style=\"color: #333;font-weight: bold\">new<\/span> <span style=\"color: #0086b3\">Map<\/span>({ \r\n  basemap: highContrastLightBasemap \r\n});\r\n<\/code><\/pre>\n<p>Then add the\u00a0<a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-widgets-BasemapToggle.html\"><code>BasemapToggle<\/code>\u00a0<\/a>widget with the\u00a0<a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-widgets-BasemapToggle.html#nextBasemap\" target=\"_blank\" rel=\"noopener\"><code>nextBasemap<\/code><\/a>\u00a0set to the dark basemap:<\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #333;font-weight: bold\">const<\/span> baseToggleWidget = <span style=\"color: #333;font-weight: bold\">new<\/span> BasemapToggle({ \r\n  view: view, \r\n  nextBasemap: highContrastDarkBasemap, \r\n  container: baseToggleDiv \r\n});\r\n<\/code><\/pre>\n<p>Finally, toggle the JS Maps SDK theme for additional contrast on the controls. For instance, when the high contrast light basemap is active, the JS Maps SDK theme is dark:<\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #333;font-weight: bold\">const<\/span> baseToggleDiv = <span style=\"color: #0086b3\">document<\/span>.getElementById(<span style=\"color: #d14\">\"baseToggleDiv\"<\/span>);\r\n\r\nbaseToggleDiv.addEventListener(<span style=\"color: #d14\">\"click\"<\/span>, () =&gt; { \r\n  <span style=\"color: #333;font-weight: bold\">const<\/span> lightTheme = <span style=\"color: #0086b3\">document<\/span>.getElementById(<span style=\"color: #d14\">\"darkTheme\"<\/span>); \r\n  <span style=\"color: #333;font-weight: bold\">const<\/span> darkTheme = <span style=\"color: #0086b3\">document<\/span>.getElementById(<span style=\"color: #d14\">\"lightTheme\"<\/span>); \r\n  lightTheme.toggleAttribute(<span style=\"color: #d14\">\"disabled\"<\/span>); \r\n  darkTheme.toggleAttribute(<span style=\"color: #d14\">\"disabled\"<\/span>); \r\n});\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"storymap","title":"Customize graphics by basemap theme","description":"<p>To style graphics added to the map with an appropriate color contrast ratio of the basemap, first obtain the basemap background color using <code>getBasemapBackground<\/code> and <code>getBasemapColor<\/code>and use the value.<\/p>\n","static":false,"storymap_url":"<a href=\"https:\/\/kellyhutchins.github.io\/DevSummit2023-A11y\/demos\/BasemapColor.html\">https:\/\/kellyhutchins.github.io\/DevSummit2023-A11y\/demos\/BasemapColor.html<\/a>"},{"acf_fc_layout":"content","content":"<p>Use <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-core-reactiveUtils.html\" target=\"_blank\" rel=\"noopener\"><code>reactiveUtils<\/code><\/a> to watch when the basemap&#8217;s background theme color changes from light to dark, or vice versa. An <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/AbortController\"><code>AbortController<\/code><\/a> signal can be used to communicate, or abort a request in the DOM, in this case when the view is no longer updating.<\/p>\n<p>Once the view has finished updating, use <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-views-support-colorUtils.html#getBackgroundColorTheme\" target=\"_blank\" rel=\"noopener\"><code>getBackgroundColorTheme<\/code><\/a> and based on the light or dark value, update the <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-Graphic.html#symbol\">graphic&#8217;s symbol<\/a> color.<\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #333;font-weight: bold\">let<\/span> abortController = <span style=\"color: #333;font-weight: 500\">null<\/span>;\r\n\r\n<span style=\"color: #333;font-weight: bold\">const<\/span> basemapHandle = reactiveUtils.watch(\r\n  () =&gt; view.map.basemap,\r\n  () =&gt; onBasemapChange(),\r\n  { initial: <span style=\"color: #333;font-weight: 500\">true<\/span> }\r\n);\r\n\r\n<span style=\"color: #998;font-style: italic\">\/\/ Remove watch handle when view is destroyed<\/span>\r\nview.addHandles(basemapHandle);\r\n\r\n<span style=\"color: #333;font-weight: bold\">async<\/span> <span style=\"color: #333;font-weight: bold\">function<\/span> <span style=\"color: #900;font-weight: bold\">onBasemapChange<\/span>() {\r\n  abortController?.abort();\r\n  <span style=\"color: #333;font-weight: bold\">const<\/span> { signal } = (abortController = <span style=\"color: #333;font-weight: bold\">new<\/span> AbortController());\r\n\r\n  <span style=\"color: #333;font-weight: bold\">await<\/span> reactiveUtils.whenOnce(() =&gt; !view.updating, signal);\r\n\r\n  <span style=\"color: #998;font-style: italic\">\/\/ getBackgroundColor is also available<\/span>\r\n  <span style=\"color: #333;font-weight: bold\">const<\/span> backgroundTheme = <span style=\"color: #333;font-weight: bold\">await<\/span> colorUtils.getBackgroundColorTheme(view);\r\n  <span style=\"color: #333;font-weight: bold\">const<\/span> color = backgroundTheme === <span style=\"color: #d14\">\"light\"<\/span> ? lightColor : darkColor;\r\n\r\n  locate.graphic.symbol.color = color;\r\n  <span style=\"color: #333;font-weight: bold\">if<\/span> (hasLocation) {\r\n    <span style=\"color: #998;font-style: italic\">\/\/ We already have a graphic. Let's recreate<\/span>\r\n    view.graphics.removeAll();\r\n    locate.locate();\r\n  }\r\n}\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<h2>Navigating through content<\/h2>\n<p><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW37442945 BCX0\"><span class=\"TextRun SCXW37442945 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW37442945 BCX0\">Focus attributes, which is the practice of underlining, <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW37442945 BCX0\"><span class=\"TextRun SCXW37442945 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW37442945 BCX0\">highlighting<\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW37442945 BCX0\"><span class=\"TextRun SCXW37442945 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW37442945 BCX0\"> or placing a shape around an active element, <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW37442945 BCX0\"><span class=\"TextRun SCXW37442945 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW37442945 BCX0\">are<\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW37442945 BCX0\"><span class=\"TextRun SCXW37442945 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW37442945 BCX0\"> important to accessibility<\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW37442945 BCX0\"><span class=\"TextRun SCXW37442945 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW37442945 BCX0\"> because it shows people where they are on the screen and provide<\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW37442945 BCX0\"><span class=\"TextRun SCXW37442945 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW37442945 BCX0\">s<\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW37442945 BCX0\"><span class=\"TextRun SCXW37442945 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW37442945 BCX0\"> context in <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW37442945 BCX0\"><span class=\"TextRun SCXW37442945 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW37442945 BCX0\">navigation as well as supporting better keyboard navigation. <\/span><\/span><\/span><a href=\"https:\/\/www.w3.org\/TR\/UNDERSTANDING-WCAG20\/navigation-mechanisms-focus-order.html\" target=\"_blank\" rel=\"noopener\" aria-describedby=\"new-window\">WCAG Success Criterion 2.4.3: Focus Order<\/a> ensures users can navigate sequentially through content, including operation with a keyboard.<\/p>\n"},{"acf_fc_layout":"storymap","title":"Add focus to popups on open","description":"<p>Use the <code>shouldFocus<\/code> option to shift focus to the popup on <code>Popup.open<\/code>.<\/p>\n","static":false,"storymap_url":"<a href=\"https:\/\/kellyhutchins.github.io\/DevSummit2023-A11y\/demos\/PopupFocus.html\">https:\/\/kellyhutchins.github.io\/DevSummit2023-A11y\/demos\/PopupFocus.html<\/a>"},{"acf_fc_layout":"content","content":"<p>When using the <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-widgets-Popup.html#open\" target=\"_blank\" rel=\"noopener\"><code>Popup<\/code>&#8216;s <code>open<\/code> method<\/a>, use the <code>shouldFocus<\/code> option to shift focus to the popup when opened.<\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\">view.popup.open({ \r\n  location: event.mapPoint, \r\n  shouldFocus: <span style=\"color: #333;font-weight: 500\">true<\/span> \r\n});\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"storymap","title":"Search widget focus","description":"<p>Shift focus between the search widget and the search results popup with <code>reactiveUtils<\/code>. Upon closing the results popup, focus will shift back to the search widget so users can navigate sequentially while searching the map's content.<\/p>\n","static":false,"storymap_url":"<a href=\"https:\/\/kellyhutchins.github.io\/DevSummit2023-A11y\/demos\/SearchFocus.html\">https:\/\/kellyhutchins.github.io\/DevSummit2023-A11y\/demos\/SearchFocus.html<\/a>"},{"acf_fc_layout":"content","content":"<p>When the popup is visible, set focus to the popup from the search widget using the <code><a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-widgets-Search.html#event-search-complete\" target=\"_blank\" rel=\"noopener\">search-complete<\/a><\/code> event.<\/p>\n<p>First, create a promise with the <code><a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-core-reactiveUtils.html\" target=\"_blank\" rel=\"noopener\">reactiveUtils whenOnce()<\/a><\/code> method and an <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/AbortController\"><code>AbortController<\/code><\/a> signal when the popup is visible. Once visible, shift focus to the popup.<\/p>\n<p>A second promise waits for the popup to no longer be visible, where focus will be set back to the search widget.<\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\">search.on(<span style=\"color: #d14\">\"search-complete\"<\/span>, () =&gt; onSearchComplete());\r\n\r\n<span style=\"color: #333;font-weight: bold\">let<\/span> abortController = <span style=\"color: #333;font-weight: 500\">null<\/span>;\r\n    \r\n<span style=\"color: #333;font-weight: bold\">async<\/span> <span style=\"color: #333;font-weight: bold\">function<\/span> <span style=\"color: #900;font-weight: bold\">onSearchComplete<\/span>() {\r\n  abortController?.abort();\r\n  <span style=\"color: #333;font-weight: bold\">const<\/span> { signal } = (abortController = <span style=\"color: #333;font-weight: bold\">new<\/span> AbortController());\r\n\r\n  <span style=\"color: #998;font-style: italic\">\/\/ When the popup is visible set focus on it.<\/span>\r\n  <span style=\"color: #333;font-weight: bold\">await<\/span> reactiveUtils.whenOnce(() =&gt; view.popup.visible, signal);\r\n  view.popup.focus();\r\n\r\n  <span style=\"color: #998;font-style: italic\">\/\/ And when the popup is closed move the focus back to the search widget.<\/span>\r\n  <span style=\"color: #333;font-weight: bold\">await<\/span> reactiveUtils.whenOnce(() =&gt; !view.popup.visible, signal);\r\n  search.focus();\r\n}\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<h2>Animations<\/h2>\n<p><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW244858975 BCX0\"><span class=\"TextRun SCXW244858975 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW244858975 BCX0\">People who ma<\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW244858975 BCX0\"><span class=\"TextRun SCXW244858975 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW244858975 BCX0\">y suffer from <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW244858975 BCX0\"><span class=\"TextRun SCXW244858975 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW244858975 BCX0\">vestibular disorders <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW244858975 BCX0\"><span class=\"TextRun SCXW244858975 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW244858975 BCX0\">or have suffered from traumatic brain injury <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW244858975 BCX0\"><span class=\"TextRun SCXW244858975 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW244858975 BCX0\">and <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW244858975 BCX0\"><span class=\"TextRun SCXW244858975 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW244858975 BCX0\">can be <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW244858975 BCX0\"><span class=\"TextRun SCXW244858975 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW244858975 BCX0\">triggered by animations <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW244858975 BCX0\"><span class=\"TextRun SCXW244858975 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW244858975 BCX0\">may consider choosing settings on their OS and browser to reduce animations and other interactive elements that could induce headaches,<\/span><\/span><\/span> <span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW244858975 BCX0\"><span class=\"TextRun SCXW244858975 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW244858975 BCX0\">n<\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW244858975 BCX0\"><span class=\"TextRun SCXW244858975 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW244858975 BCX0\">ausea,<\/span><\/span><\/span> <span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW244858975 BCX0\"><span class=\"TextRun SCXW244858975 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW244858975 BCX0\">or <\/span><\/span><\/span><span class=\"TrackChangeTextInsertion TrackedChange TrackChangeHoverSelectColorRed SCXW244858975 BCX0\"><span class=\"TextRun SCXW244858975 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun TrackChangeHoverSelectHighlightRed SCXW244858975 BCX0\">seizures.\u00a0<\/span><\/span><\/span><a href=\"https:\/\/www.w3.org\/WAI\/WCAG21\/Understanding\/animation-from-interactions.html\" target=\"_blank\" rel=\"noopener\" aria-describedby=\"new-window\">WCAG Success Criterion 2.3.3: Animation from Interaction<\/a> allows the user to disable interactions, unless animation is an essential function for the information conveyed.<\/p>\n"},{"acf_fc_layout":"storymap","title":"Reduced motion support with Calcite's loader component","description":"<p>Calcite minimizes animation when system animations are turned off or reduced. When animations are enabled, animations are executed in Calcite's loader component. When animations are turned off or reduced, animations are greatly reduced.<\/p>\n","static":false,"storymap_url":"<a href=\"https:\/\/kellyhutchins.github.io\/DevSummit2023-A11y\/demos\/ReducedMotionSupportCalciteLoader.html\">https:\/\/kellyhutchins.github.io\/DevSummit2023-A11y\/demos\/ReducedMotionSupportCalciteLoader.html<\/a>"},{"acf_fc_layout":"storymap","title":"Prefers reduced motion with JavaScript Maps SDK","description":"<p>Animation on the map can be reduced when animations are not shown or reduced with <code>prefers-reduced-motion<\/code>. When animations are enabled, some of the map's functions, such as zooming to a feature, include basemap tile animations. When animations are turned off or reduced, a function can be added to reduce map animations.<\/p>\n","static":false,"storymap_url":"<a href=\"https:\/\/kellyhutchins.github.io\/DevSummit2023-A11y\/demos\/PrefersReducedMotion.html\">https:\/\/kellyhutchins.github.io\/DevSummit2023-A11y\/demos\/PrefersReducedMotion.html<\/a>"},{"acf_fc_layout":"content","content":"<p>First, add the <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-widgets-Popup.html#goToOverride\" target=\"_blank\" rel=\"noopener\">goToOverride<\/a> function to the popup&#8217;s goTo method:<\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\">view.popup.goToOverride = goToOverride;\r\n<\/code><\/pre>\n<p>Next, add a new function to set a media query to the <code>prefers-reduced-motion<\/code> CSS media feature, which when animation is disabled on the OS will minimize non-essential motion in the map for users:<\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #333;font-weight: bold\">function<\/span> <span style=\"color: #900;font-weight: bold\">goToOverride<\/span> (view, goToParams) { \r\n  <span style=\"color: #333;font-weight: bold\">const<\/span> mediaQuery = <span style=\"color: #0086b3\">window<\/span>.matchMedia(<span style=\"color: #d14\">\"(prefers-reduced-motion: reduce)\"<\/span>); \r\n  <span style=\"color: #333;font-weight: bold\">if<\/span> (mediaQuery.matches) { \r\n    goToParams.options = { \r\n      ...goToParams.options, \r\n      ...{ \r\n        animate: <span style=\"color: #333;font-weight: 500\">false<\/span>, \r\n      }, \r\n    }; \r\n  } \r\n  <span style=\"color: #333;font-weight: bold\">return<\/span> view.goTo(goToParams.target, goToParams.options); \r\n}\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<h2>Explore further<\/h2>\n<p>Content above has been summarized from the 2023 Developer Summit&#8217;s &#8220;Building Accessible Web Apps with ArcGIS Maps SDK for JavaScript and Calcite Design System&#8221; session in Palm Springs, California.<\/p>\n<p>The code and full demonstrations are available on <a href=\"https:\/\/github.com\/kellyhutchins\/DevSummit2023-A11y\">GitHub<\/a>. You can stay up to date on accessibility updates by <a href=\"https:\/\/community.esri.com\/t5\/accessibility\/ct-p\/accessibility\">subscribing to our Accessibility community<\/a>.<\/p>\n"},{"acf_fc_layout":"content","content":"<h2>Final thoughts<\/h2>\n<p>We&#8217;re here to support you in the successful implementation of accessible mapping apps. <span data-contrast=\"auto\">As developers and designers create web and mobile content, it is more efficient to include accessibility throughout the development lifecycle rather than <\/span><span data-contrast=\"auto\">having to rework published apps.<\/span><\/p>\n<p>Accessibility should not be an afterthought and be a part of the development process throughout the app\u2019s design and development workflow. But to get to this level of success, we must work together to break down barriers so that anyone who needs access to web maps, whether as a developer or a user, can obtain it.<\/p>\n"}],"related_articles":"","card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/basemap-img-card-filter.png","wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/a11y-web-apps-cover.png"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Build accessible web apps with ArcGIS Maps SDK for JavaScript and Calcite Design System<\/title>\n<meta name=\"description\" content=\"Learn how to make web app accessible using the ArcGIS Maps SDK for JavaScript and Calcite Design System.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Build accessible web apps with ArcGIS Maps SDK for JavaScript and Calcite Design System\" \/>\n<meta property=\"og:description\" content=\"Learn how to make web app accessible using the ArcGIS Maps SDK for JavaScript and Calcite Design System.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"article:modified_time\" content=\"2024-10-24T22:07:33+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system\"},\"author\":{\"name\":\"Kitty Hurley\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/1d3e2f690ee8951f6625010e5b55aee8\"},\"headline\":\"Build accessible web apps with ArcGIS Maps SDK for JavaScript and Calcite Design System\",\"datePublished\":\"2023-04-10T14:39:50+00:00\",\"dateModified\":\"2024-10-24T22:07:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system\"},\"wordCount\":14,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"accessibility\",\"ArcGIS Maps SDK for JavaScript\",\"Calcite Design System\",\"web accessibility\"],\"articleSection\":[\"Developers\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system\",\"name\":\"Build accessible web apps with ArcGIS Maps SDK for JavaScript and Calcite Design System\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2023-04-10T14:39:50+00:00\",\"dateModified\":\"2024-10-24T22:07:33+00:00\",\"description\":\"Learn how to make web app accessible using the ArcGIS Maps SDK for JavaScript and Calcite Design System.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Build accessible web apps with ArcGIS Maps SDK for JavaScript and Calcite Design System\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/1d3e2f690ee8951f6625010e5b55aee8\",\"name\":\"Kitty Hurley\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/03\/Esri_Day2_PSCC2024_H_0127-e1710789483673-261x261.jpg\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/03\/Esri_Day2_PSCC2024_H_0127-e1710789483673-261x261.jpg\",\"caption\":\"Kitty Hurley\"},\"description\":\"Kitty is a Principal Product Engineer with Calcite Design System, passionate about expanding access to the web and maps for broader audiences. She is dedicated to creating inclusive, user-friendly web experiences that connect people and places through innovative design and technology. Outside of work, Kitty enjoys exploring the wilderness of Minnesota and has a goal to visit every major league baseball stadium across America.\",\"sameAs\":[\"https:\/\/www.github.com\/geospatialem\",\"https:\/\/www.linkedin.com\/in\/khurley\",\"https:\/\/x.com\/geospatialem\"],\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/author\/khurley\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Build accessible web apps with ArcGIS Maps SDK for JavaScript and Calcite Design System","description":"Learn how to make web app accessible using the ArcGIS Maps SDK for JavaScript and Calcite Design System.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system","og_locale":"en_US","og_type":"article","og_title":"Build accessible web apps with ArcGIS Maps SDK for JavaScript and Calcite Design System","og_description":"Learn how to make web app accessible using the ArcGIS Maps SDK for JavaScript and Calcite Design System.","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2024-10-24T22:07:33+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","twitter_misc":{"Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system"},"author":{"name":"Kitty Hurley","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/1d3e2f690ee8951f6625010e5b55aee8"},"headline":"Build accessible web apps with ArcGIS Maps SDK for JavaScript and Calcite Design System","datePublished":"2023-04-10T14:39:50+00:00","dateModified":"2024-10-24T22:07:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system"},"wordCount":14,"commentCount":0,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["accessibility","ArcGIS Maps SDK for JavaScript","Calcite Design System","web accessibility"],"articleSection":["Developers"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system","name":"Build accessible web apps with ArcGIS Maps SDK for JavaScript and Calcite Design System","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2023-04-10T14:39:50+00:00","dateModified":"2024-10-24T22:07:33+00:00","description":"Learn how to make web app accessible using the ArcGIS Maps SDK for JavaScript and Calcite Design System.","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Build accessible web apps with ArcGIS Maps SDK for JavaScript and Calcite Design System"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/1d3e2f690ee8951f6625010e5b55aee8","name":"Kitty Hurley","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/03\/Esri_Day2_PSCC2024_H_0127-e1710789483673-261x261.jpg","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/03\/Esri_Day2_PSCC2024_H_0127-e1710789483673-261x261.jpg","caption":"Kitty Hurley"},"description":"Kitty is a Principal Product Engineer with Calcite Design System, passionate about expanding access to the web and maps for broader audiences. She is dedicated to creating inclusive, user-friendly web experiences that connect people and places through innovative design and technology. Outside of work, Kitty enjoys exploring the wilderness of Minnesota and has a goal to visit every major league baseball stadium across America.","sameAs":["https:\/\/www.github.com\/geospatialem","https:\/\/www.linkedin.com\/in\/khurley","https:\/\/x.com\/geospatialem"],"url":"https:\/\/www.esri.com\/arcgis-blog\/author\/khurley"}]}},"text_date":"April 10, 2023","author_name":"Multiple Authors","author_page":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/developers\/build-accessible-web-apps-with-arcgis-maps-sdk-for-javascript-and-calcite-design-system","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/03\/a11y-web-apps-cover.png","primary_product":"ArcGIS Maps SDK for JavaScript","tag_data":[{"term_id":28911,"name":"accessibility","slug":"accessibility","term_group":0,"term_taxonomy_id":28911,"taxonomy":"post_tag","description":"","parent":0,"count":71,"filter":"raw"},{"term_id":769562,"name":"ArcGIS Maps SDK for JavaScript","slug":"arcgis-maps-sdk-for-javascript","term_group":0,"term_taxonomy_id":769562,"taxonomy":"post_tag","description":"","parent":0,"count":28,"filter":"raw"},{"term_id":759512,"name":"Calcite Design System","slug":"calcite-design-system","term_group":0,"term_taxonomy_id":759512,"taxonomy":"post_tag","description":"","parent":0,"count":15,"filter":"raw"},{"term_id":706381,"name":"web accessibility","slug":"web-accessibility","term_group":0,"term_taxonomy_id":706381,"taxonomy":"post_tag","description":"","parent":0,"count":13,"filter":"raw"}],"category_data":[{"term_id":738191,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":738191,"taxonomy":"category","description":"","parent":0,"count":422,"filter":"raw"}],"product_data":[{"term_id":36831,"name":"ArcGIS Maps SDK for JavaScript","slug":"js-api-arcgis","term_group":0,"term_taxonomy_id":36831,"taxonomy":"product","description":"","parent":36601,"count":362,"filter":"raw"},{"term_id":36601,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":36601,"taxonomy":"product","description":"","parent":0,"count":763,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=js-api-arcgis","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/1878872","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/309572"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=1878872"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/1878872\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=1878872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=1878872"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=1878872"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=1878872"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=1878872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}