{"id":2946387,"date":"2025-11-17T07:00:27","date_gmt":"2025-11-17T15:00:27","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2946387"},"modified":"2025-11-17T09:55:41","modified_gmt":"2025-11-17T17:55:41","slug":"optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components","title":{"rendered":"Optimizing Custom Widgets in ArcGIS Experience Builder with Jimu UI, Calcite, and Map Components"},"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":[759512],"industry":[],"product":[400032,36831],"class_list":["post-2946387","blog","type-blog","status-publish","format-standard","hentry","category-developers","tag-calcite-design-system","product-experience-builder","product-js-api-arcgis"],"acf":{"authors":[{"ID":360712,"user_firstname":"Kevin","user_lastname":"Gonzago","nickname":"Kevin Gonzago","user_nicename":"kgonzago","display_name":"Kevin Gonzago","user_email":"kgonzago@esri.com","user_url":"","user_registered":"2024-08-26 20:33:13","user_description":"Kevin Gonzago is a Principal Product Engineer on the Developer Experience team, where he helps developers succeed with Esri\u2019s products, APIs, and SDKs through tools, guidance, and best practices. In his free time, Kevin loves lacing up his running shoes to explore new neighborhoods\u2014chasing scenic routes and local eateries.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/08\/profile-213x200.png' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"},{"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'\/>"}],"short_description":"Explore how to optimize your custom widgets in ArcGIS Experience Builder using Jimu UI, Calcite, and Map components","flexible_content":[{"acf_fc_layout":"image","image":{"ID":2948482,"id":2948482,"title":"","filename":"Banner_-1920px-x-1080px.png","filesize":378546,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/Banner_-1920px-x-1080px.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components\/banner_-1920px-x-1080px","alt":"","author":"309572","description":"","caption":"","name":"banner_-1920px-x-1080px","status":"inherit","uploaded_to":2946387,"date":"2025-11-14 23:05:54","modified":"2025-11-14 23:06:04","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\/2025\/10\/Banner_-1920px-x-1080px-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/Banner_-1920px-x-1080px.png","medium-width":464,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/Banner_-1920px-x-1080px.png","medium_large-width":768,"medium_large-height":432,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/Banner_-1920px-x-1080px.png","large-width":1920,"large-height":1080,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/Banner_-1920px-x-1080px-1536x864.png","1536x1536-width":1536,"1536x1536-height":864,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/Banner_-1920px-x-1080px.png","2048x2048-width":1920,"2048x2048-height":1080,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/Banner_-1920px-x-1080px-826x465.png","card_image-width":826,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/Banner_-1920px-x-1080px.png","wide_image-width":1920,"wide_image-height":1080}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p><span data-contrast=\"auto\">When you first start building custom widgets in <\/span><a href=\"https:\/\/developers.arcgis.com\/experience-builder\/guide\/getting-started-widget\/\"><span data-contrast=\"none\">ArcGIS Experience Builder<\/span><\/a><span data-contrast=\"auto\">, the goal is to make it work. <span class=\"NormalTextRun SCXW207525912 BCX0\">Ho<\/span><span class=\"NormalTextRun SCXW207525912 BCX0\">wever, o<\/span><span class=\"NormalTextRun SCXW207525912 BCX0\">nce you add more\u00a0<\/span><span class=\"NormalTextRun SCXW207525912 BCX0\">user interface (<\/span><span class=\"NormalTextRun SCXW207525912 BCX0\">UI<\/span><span class=\"NormalTextRun SCXW207525912 BCX0\">)<\/span><span class=\"NormalTextRun SCXW207525912 BCX0\">, maps, and interactivity,\u00a0<\/span><span class=\"NormalTextRun SCXW207525912 BCX0\">things\u00a0<\/span><span class=\"NormalTextRun SCXW207525912 BCX0\">can start to feel sluggish. Load times increase, interactions lag, and the app\u2019s responsiveness takes a hit.<\/span><span class=\"NormalTextRun SCXW207525912 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW207525912 BCX0\">Th<\/span><span class=\"NormalTextRun SCXW207525912 BCX0\">is is<\/span><span class=\"NormalTextRun SCXW207525912 BCX0\">\u00a0when optimization matters.<\/span><\/span><\/p>\n<p><span class=\"TextRun SCXW55562122 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW55562122 BCX0\">W<\/span><span class=\"NormalTextRun SCXW55562122 BCX0\">e\u2019ll<\/span><span class=\"NormalTextRun SCXW55562122 BCX0\">\u00a0look at<\/span><span class=\"NormalTextRun SCXW55562122 BCX0\">\u00a0one of the factors\u00a0<\/span><span class=\"NormalTextRun SCXW55562122 BCX0\">in<\/span><span class=\"NormalTextRun SCXW55562122 BCX0\">\u00a0how to keep your Experience Builder widgets fast and efficient using the three main\u00a0<\/span><span class=\"NormalTextRun SCXW55562122 BCX0\">component<\/span><span class=\"NormalTextRun SCXW55562122 BCX0\">\u00a0systems\u00a0<\/span><span class=\"NormalTextRun SCXW55562122 BCX0\">in your apps<\/span><span class=\"NormalTextRun SCXW55562122 BCX0\">:<\/span><\/span><span class=\"EOP SCXW55562122 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<ul>\n<li><a href=\"https:\/\/developers.arcgis.com\/documentation\/app-builders\/low-code\/arcgis-experience-builder\/jimu-ui-components-in-a-custom-widget\/\"><b><span data-contrast=\"none\">Jimu UI Components<\/span><\/b><\/a><span data-contrast=\"auto\"> \u2013 a <\/span><a href=\"https:\/\/react.dev\/\"><span data-contrast=\"none\">React<\/span><\/a><span data-contrast=\"auto\">-based library built into Experience Builder.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<li><a href=\"https:\/\/developers.arcgis.com\/documentation\/app-builders\/low-code\/arcgis-experience-builder\/calcite-components-in-a-custom-widget\/\"><b><span data-contrast=\"none\">Calcite Components<\/span><\/b><\/a><span data-contrast=\"auto\"> \u2013 <span class=\"NormalTextRun SCXW241887000 BCX0\">Esri\u2019s <\/span><span class=\"NormalTextRun SCXW241887000 BCX0\">web\u00a0<\/span><span class=\"NormalTextRun SCXW241887000 BCX0\">component<\/span><span class=\"NormalTextRun SCXW241887000 BCX0\">\u00a0library\u00a0<\/span><span class=\"NormalTextRun SCXW241887000 BCX0\">for bui<\/span><span class=\"NormalTextRun SCXW241887000 BCX0\">lding<\/span> <span class=\"NormalTextRun SCXW241887000 BCX0\">apps <\/span><span class=\"NormalTextRun SCXW241887000 BCX0\">with accessibility in mind<\/span><span class=\"NormalTextRun SCXW241887000 BCX0\">.<\/span><\/span><\/li>\n<li><a href=\"https:\/\/developers.arcgis.com\/documentation\/app-builders\/low-code\/arcgis-experience-builder\/use-map-components-in-custom-widget\/\"><b><span data-contrast=\"none\">Map components<\/span><\/b><\/a><span data-contrast=\"auto\"> \u2013 lightweight ArcGIS Maps SDK web components for maps, scenes, and tools.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<p>We&#8217;ll introduce the following topics:<\/p>\n<ul>\n<li><a href=\"#keep-imports-lean\"><span data-contrast=\"none\">Keep imports lean<\/span><\/a><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<li><a href=\"#manage-state-to-avoid-rerenders\"><span data-contrast=\"none\">Manage state to avoid React re-renders<\/span><\/a><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<li><a href=\"#work-smarter-with-map-components\"><span data-contrast=\"none\">Work smarter with Map components<\/span><\/a><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<li><a href=\"#keep-styling-consistent\"><span data-contrast=\"none\">Keep styling consistent<\/span><\/a><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<p><strong>Note<\/strong>: If you&#8217;re new to widget development, check out the <a href=\"https:\/\/developers.arcgis.com\/experience-builder\/guide\/getting-started-widget\/\">getting started with widget development<\/a> for foundational concepts.<\/p>\n"},{"acf_fc_layout":"content","content":"<h2>Overview of component libraries<\/h2>\n<p><span data-contrast=\"auto\">Each library plays a unique role in Experience Builder development and knowing when and how to use each one helps you avoid unnecessary overhead.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<ul>\n<li style=\"margin-bottom: 10px\"><a href=\"https:\/\/developers.arcgis.com\/experience-builder\/api-reference\/jimu-ui\/\"><b><span data-contrast=\"none\">Jimu UI<\/span><\/b><\/a><span data-contrast=\"auto\"> provides <\/span><a href=\"https:\/\/developers.arcgis.com\/documentation\/app-builders\/low-code\/arcgis-experience-builder\/jimu-ui-components-in-a-custom-widget\/\"><span data-contrast=\"none\">React components built for Experience Builder<\/span><\/a><span data-contrast=\"auto\">, such as <\/span><code><span style=\"color: #e36209\"><span style=\"color: #6f42c1\">Buttons<\/span><\/span><\/code>, <code><span style=\"color: #e36209\"><span style=\"color: #6f42c1\">Switches<\/span><\/span><\/code>, <code><span style=\"color: #e36209\"><span style=\"color: #6f42c1\">Sliders<\/span><\/span><\/code>, and <code><span style=\"color: #e36209\"><span style=\"color: #6f42c1\">Layout<\/span><\/span><\/code> helpers. Because these are the same components used by the core application, they integrate naturally with Experience Builder\u2019s themes and layouts. If you need more advanced widgets, such as <code><span style=\"color: #e36209\"><span style=\"color: #6f42c1\">FeatureLayerPicker<\/span><\/span><\/code>, <code><span style=\"color: #e36209\"><span style=\"color: #6f42c1\">FieldSelector<\/span><\/span><\/code>, or <code><span style=\"color: #e36209\"><span style=\"color: #6f42c1\">Filter<\/span><\/span><\/code>, you can import them from <code><span style=\"color: #032f62\">jimu-ui\/advanced<\/span><\/code>.<span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<li style=\"margin-bottom: 10px\"><a href=\"https:\/\/developers.arcgis.com\/calcite-design-system\/\"><b><span data-contrast=\"none\">Calcite Components<\/span><\/b><\/a><span data-contrast=\"auto\"> are <\/span><a href=\"https:\/\/developers.arcgis.com\/documentation\/app-builders\/low-code\/arcgis-experience-builder\/calcite-components-in-a-custom-widget\/\"><span data-contrast=\"none\">web components built on Esri\u2019s design system<\/span><\/a><span data-contrast=\"auto\">. <span class=\"NormalTextRun SCXW138997781 BCX0\">Calcite<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">is<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">\u00a0best\u00a0<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">served\u00a0<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">when<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">creat<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">ing a<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">\u00a0UI\u00a0<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">or<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">when looking for a cons<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">istent<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">Esri<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">\u00a0web app\u00a0<\/span><span class=\"NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW138997781 BCX0\">look<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">\u00a0and feel.\u00a0<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">Since\u00a0<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">Calcite Components are<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">\u00a0shipped as standalone web components, you should<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">\u00a0<\/span><a href=\"https:\/\/developers.arcgis.com\/calcite-design-system\/get-started\/#custom-elements-build\"><span class=\"NormalTextRun SCXW138997781 BCX0\">import<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">\u00a0components individually<\/span><\/a><span class=\"NormalTextRun SCXW138997781 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW138997781 BCX0\">to avoid inflating your bundle.<\/span><\/span><\/li>\n<li style=\"margin-bottom: 10px\"><a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/references\/map-components\/\"><b><span data-contrast=\"none\">Map components<\/span><\/b><\/a><span data-contrast=\"auto\"> bring ArcGIS Maps SDK functionality directly into your widget without manually creating <\/span><code><span style=\"color: #e36209\"><span style=\"color: #6f42c1\">MapView<\/span><\/span><\/code> or <code><span style=\"color: #e36209\"><span style=\"color: #6f42c1\">SceneView<\/span><\/span><\/code>\u00a0objects. You can add an<code>&lt;<span style=\"color: #e36209\">arcgis<\/span>-<span style=\"color: #e36209\">map<\/span>&gt;<\/code>element in your React render method and get instant map functionality with minimal setup, as shown in the <a href=\"https:\/\/developers.arcgis.com\/documentation\/app-builders\/low-code\/arcgis-experience-builder\/use-map-components-in-custom-widget\/\"><span data-contrast=\"none\">Map components documentation<\/span><\/a><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n"},{"acf_fc_layout":"content","content":"<p>For instance, imports statements for each library:<\/p>\n<pre><code><span style=\"color: #6a737d\">\/\/ Jimu UI <\/span>\r\n<span style=\"color: #d73a49\">import<\/span> { <span style=\"color: #6f42c1\">Button<\/span>, <span style=\"color: #6f42c1\">Switch<\/span> } <span style=\"color: #d73a49\">from<\/span> <span style=\"color: #032f62\">'jimu-ui'<\/span>\r\n\r\n<span style=\"color: #6a737d\">\/\/ Calcite <\/span>\r\n<span style=\"color: #d73a49\">import<\/span> <span style=\"color: #032f62\">'@esri\/calcite-components\/dist\/components\/calcite-button'<\/span>\r\n\r\n<span style=\"color: #6a737d\">\/\/ Map <\/span>\r\n<span style=\"color: #d73a49\">import<\/span> <span style=\"color: #032f62\">'@arcgis\/map-components\/dist\/components\/arcgis-map'<\/span>\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<h2 id=\"keep-imports-lean\">Keep imports lean<\/h2>\n<p><span data-contrast=\"auto\">Large imports are one of the most common causes of slow widget load times. If you import entire libraries, your production bundle grows unnecessarily. <\/span><span data-contrast=\"auto\">Import only\u00a0components\u00a0needed\u00a0to improve performance and your bundle:<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<pre><code><span style=\"color: #6a737d\">\/\/ Import only the components needed<\/span>\r\n<span style=\"color: #d73a49\">import<\/span> { <span style=\"color: #6f42c1\">Button<\/span>, <span style=\"color: #6f42c1\">Slider<\/span> } <span style=\"color: #d73a49\">from<\/span> <span style=\"color: #032f62\">'jimu-ui'<\/span><\/code><\/pre>\n<p><span class=\"TextRun SCXW23630541 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW23630541 BCX0\">Avoid<\/span><span class=\"NormalTextRun SCXW23630541 BCX0\">\u00a0importing everything from\u00a0<\/span><span class=\"NormalTextRun SCXW23630541 BCX0\">libraries<\/span><span class=\"NormalTextRun SCXW23630541 BCX0\">:<\/span><\/span><span class=\"EOP SCXW23630541 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<pre><code><span style=\"color: #6a737d\">\/\/ Avoid importing all of Jimu UI<\/span>\r\n<span style=\"color: #d73a49\">import<\/span> * <span style=\"color: #d73a49\">as<\/span> <span style=\"color: #6f42c1\">JimuUI<\/span> <span style=\"color: #d73a49\">from<\/span> <span style=\"color: #032f62\">'jimu-ui'<\/span><\/code><\/pre>\n<p>The <a href=\"https:\/\/developers.arcgis.com\/experience-builder\/storybook\/?path=\/docs\/welcome--docs\">Jimu UI storybook<\/a> documentation lists every available component, making it easy to find what you need and import selectively.<\/p>\n<p>For Calcite Components,\u00a0<a href=\"https:\/\/developers.arcgis.com\/experience-builder\/guide\/\">ArcGIS Experience Builder Developer Edition<\/a> includes those components as part of its architecture. Starting with version 1.8, you can import Calcite Components directly from the <code><span style=\"color: #032f62\">calcite-components<\/span><\/code> entry bundled with Experience Builder. It is recommended to avoid wildcard imports, and import only the components you need.<\/p>\n<pre><code><span style=\"color: #6a737d\">\/\/ Import only the components you need<\/span>\r\n<span style=\"color: #d73a49\">import<\/span> {\r\n  <span style=\"color: #6f42c1\">CalciteButton<\/span>,\r\n  <span style=\"color: #6f42c1\">CalciteIcon<\/span>,\r\n  <span style=\"color: #6f42c1\">CalciteLabel<\/span>\r\n} <span style=\"color: #d73a49\">from<\/span> <span style=\"color: #032f62\">\"calcite-components\"<\/span>;\r\n<\/code><\/pre>\n<p><span data-contrast=\"auto\">The\u00a0<\/span><a href=\"https:\/\/developers.arcgis.com\/documentation\/app-builders\/low-code\/arcgis-experience-builder\/calcite-components-in-a-custom-widget\/\"><span data-contrast=\"none\">Calcite Components in a custom widget guide<\/span><\/a><span data-contrast=\"auto\">\u00a0details how\u00a0components can be imported individually and\u00a0asset path\u00a0management\u00a0for efficient loading.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Keeping\u00a0your\u00a0imports modular\u00a0reduces\u00a0a\u00a0widget\u2019s initial load time\u00a0substantially,\u00a0in particular\u00a0when your app contains multiple widgets.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n"},{"acf_fc_layout":"content","content":"<h2 id=\"manage-state-to-avoid-rerenders\">Manage state to avoid re-renders<\/h2>\n<p><span data-contrast=\"auto\">React\u2019s\u00a0state system is powerful, but it can\u00a0result in\u00a0redundant re-renders if not managed carefully. Every time a\u00a0parent\u00a0component\u00a0updates\u00a0its\u00a0state, its children may re-render,\u00a0even if their output\u00a0hasn\u2019t\u00a0changed.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">For example, the following\u00a0is less efficient\u00a0with re-rendering:<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<pre><code><span style=\"color: #6a737d\">\/\/ Less efficient <\/span>\r\n&lt;<span style=\"color: #6f42c1\">CalciteButton<\/span> onClick={() =&gt; <span style=\"color: #6f42c1\">setCount<\/span>(count + <span style=\"color: #005cc5\">1<\/span>)}&gt;{count}&lt;\/<span style=\"color: #6f42c1\">CalciteButton<\/span>&gt;)\r\n<\/code><\/pre>\n<p><span class=\"TextRun SCXW138377356 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW138377356 BCX0\">Th<\/span><span class=\"NormalTextRun SCXW138377356 BCX0\">e following<\/span><span class=\"NormalTextRun SCXW138377356 BCX0\">\u00a0inline function\u00a0<\/span><span class=\"NormalTextRun SCXW138377356 BCX0\">is recreated<\/span><span class=\"NormalTextRun SCXW138377356 BCX0\">\u00a0on\u00a0<\/span><span class=\"NormalTextRun SCXW138377356 BCX0\">each<\/span><span class=\"NormalTextRun SCXW138377356 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW138377356 BCX0\">render<\/span><span class=\"NormalTextRun SCXW138377356 BCX0\">, where<\/span><span class=\"NormalTextRun SCXW138377356 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW138377356 BCX0\">optimization\u00a0<\/span><span class=\"NormalTextRun SCXW138377356 BCX0\">improves efficiency<\/span><span class=\"NormalTextRun SCXW138377356 BCX0\">:<\/span><\/span><span class=\"EOP SCXW138377356 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<pre><code><span style=\"color: #d73a49\"><span style=\"color: #6a737d\">\/\/ Optimize rendering in your solutions<\/span>\r\nconst<\/span> handleClick = <span style=\"color: #6f42c1\">useCallback<\/span>(() =&gt; <span style=\"color: #6f42c1\">setCount<\/span>(c =&gt; c + <span style=\"color: #005cc5\">1<\/span>), [])\r\n&lt;<span style=\"color: #22863a\">CalciteButton<\/span> <span style=\"color: #005cc5\">onClick<\/span>=<span style=\"color: #032f62\">{handleClick}<\/span>&gt;{count}&lt;\/<span style=\"color: #22863a\">CalciteButton<\/span>&gt;\r\n<\/code><\/pre>\n<p><span class=\"EOP SCXW193770729 BCX0\" data-ccp-props=\"{}\"><span class=\"TextRun SCXW34144485 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW34144485 BCX0\">These\u00a0<\/span><span class=\"NormalTextRun SCXW34144485 BCX0\">improvements<\/span><span class=\"NormalTextRun SCXW34144485 BCX0\">\u00a0to avoid re-rendering<\/span><span class=\"NormalTextRun SCXW34144485 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW34144485 BCX0\">help keep large widgets responsive,\u00a0<\/span><span class=\"NormalTextRun AdvancedProofingIssueV2Themed SCXW34144485 BCX0\">in particular<\/span><span class=\"NormalTextRun AdvancedProofingIssueV2Themed SCXW34144485 BCX0\">\u00a0<\/span><span class=\"NormalTextRun AdvancedProofingIssueV2Themed SCXW34144485 BCX0\">when<\/span><span class=\"NormalTextRun SCXW34144485 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW34144485 BCX0\">combining React with web components that\u00a0<\/span><span class=\"NormalTextRun SCXW34144485 BCX0\">don\u2019t<\/span><span class=\"NormalTextRun SCXW34144485 BCX0\">\u00a0follow\u00a0<\/span><span class=\"NormalTextRun SpellingErrorV2Themed SCXW34144485 BCX0\">React\u2019s<\/span><span class=\"NormalTextRun SCXW34144485 BCX0\">\u00a0virtual DOM.<\/span><\/span><span class=\"EOP SCXW34144485 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span> <\/span><\/p>\n"},{"acf_fc_layout":"content","content":"<h2 id=\"work-smarter-with-map-components\">Work smarter with Map components<\/h2>\n<p><span data-contrast=\"auto\">Map components are incredibly convenient, but they can also be complex if they are not managed properly<\/span><span data-contrast=\"auto\">. One of the most important principles is <strong>initialize your map once and reuse it across your app. <\/strong>This prevents unnecessary re-rendering, reduces memory usage, and improves performance.<\/span><\/p>\n<p><span class=\"TextRun SCXW212154164 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW212154164 BCX0\">For instance, to<\/span><span class=\"NormalTextRun SCXW212154164 BCX0\">\u00a0efficiently\u00a0<\/span><span class=\"NormalTextRun SCXW212154164 BCX0\">handle<\/span><span class=\"NormalTextRun SCXW212154164 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW212154164 BCX0\">map interaction:<\/span><\/span><span class=\"EOP SCXW212154164 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<pre><code><span style=\"color: #d73a49\">import<\/span> { useRef, useState } <span style=\"color: #d73a49\">from<\/span> <span style=\"color: #032f62\">\"react\"<\/span>;\r\n\r\n<span style=\"color: #d73a49\">function<\/span> <span style=\"color: #6f42c1\">MapComponent<\/span>() {\r\n  <span style=\"color: #d73a49\">const<\/span> [view, setView] = <span style=\"color: #6f42c1\">useState<\/span>(<span style=\"color: #005cc5\">null<\/span>);\r\n  <span style=\"color: #d73a49\">const<\/span> <span style=\"color: #6f42c1\">handleViewReady<\/span> = (event) =&gt; {\r\n    <span style=\"color: #d73a49\">const<\/span> mapView = event.target.view;\r\n    <span style=\"color: #6a737d\">\/\/ Initialize the Map<\/span>\r\n    <span style=\"color: #6f42c1\">setView<\/span>(mapView);    \r\n    <span style=\"color: #6a737d\">\/\/ Add a zoom widget when view is ready<\/span>\r\n    mapView.ui.<span style=\"color: #6f42c1\">add<\/span>(<span style=\"color: #032f62\">\"zoom\"<\/span>, <span style=\"color: #032f62\">\"top-left\"<\/span>);\r\n  };\r\n  <span style=\"color: #d73a49\">return<\/span> (\r\n    &lt;<span style=\"color: #22863a\">arcgis-map<\/span>\r\n      <span style=\"color: #005cc5\">item-id<\/span>=<span style=\"color: #032f62\">\"e691172598f04ea8881cd2a4adaa45ba\"<\/span>\r\n      <span style=\"color: #005cc5\">onarcgisViewReadyChange<\/span>=<span style=\"color: #032f62\">{handleViewReady}<\/span>&gt;\r\n    &lt;\/<span style=\"color: #22863a\">arcgis-map<\/span>&gt;\r\n  );\r\n}\r\n<\/code><\/pre>\n<p>Next, reference the <code><span style=\"color: #6f42c1\">MapView<\/span><\/code> for reusability:<\/p>\n<pre><code><span style=\"color: #d73a49\">function<\/span> <span style=\"color: #6f42c1\">AddLayerButton<\/span>({ view }) {\r\n  <span style=\"color: #d73a49\">const<\/span> <span style=\"color: #6f42c1\">addLayer<\/span> = <span style=\"color: #d73a49\">async<\/span> () =&gt; {\r\n    <span style=\"color: #d73a49\">const<\/span> [<span style=\"color: #6f42c1\">FeatureLayer<\/span>] = <span style=\"color: #d73a49\">await<\/span> $arcgis.<span style=\"color: #d73a49\">import<\/span>([<span style=\"color: #032f62\">\"FeatureLayer\"<\/span>]);\r\n    <span style=\"color: #d73a49\">const<\/span> layer = <span style=\"color: #d73a49\">new<\/span> <span style=\"color: #6f42c1\">FeatureLayer<\/span>({ \r\n<span style=\"color: #005cc5\">      url<\/span>: <span style=\"color: #032f62\">\"https:\/\/services.arcgis.com\/...\/FeatureServer\/0\"<\/span> \r\n    });\r\n    view.map.<span style=\"color: #6f42c1\">add<\/span>(layer);\r\n  };\r\n  <span style=\"color: #d73a49\">return<\/span> &lt;<span style=\"color: #22863a\">calcite-button<\/span> <span style=\"color: #005cc5\">onClick<\/span>=<span style=\"color: #032f62\">{addLayer}<\/span>&gt;Add Layer&lt;\/<span style=\"color: #22863a\">calcite-button<\/span>&gt;;\r\n}\r\n<\/code><\/pre>\n<p><span class=\"EOP CommentHighlightPipeRest SCXW81357776 BCX0\" data-ccp-props=\"{}\">Reusing a single map instance is important for building efficient web apps. Multiple initializations can slow down performance and increase unnecessary API calls, while a single map ensures that layers, widgets, and state remain consistent across your app. You can find more examples that detail interactions with Map components <a href=\"https:\/\/github.com\/Esri\/jsapi-resources\/tree\/main\/component-samples\/map-and-charts-components-react\">here<\/a>.<\/span><\/p>\n<p>You can configure <code>&lt;<span style=\"color: #e36209\">arcgis<\/span>-<span style=\"color: #e36209\">map<\/span>&gt;<\/code> using an item-id (for a <a href=\"https:\/\/developers.arcgis.com\/documentation\/mapping-and-location-services\/mapping\/web-maps\/\">web map<\/a> or <a href=\"https:\/\/developers.arcgis.com\/documentation\/mapping-and-location-services\/mapping\/web-scenes\/\">web scene<\/a>) or define properties directly, such as <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/references\/map-components\/arcgis-map\/#basemap\">basemap<\/a>, <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/references\/map-components\/arcgis-map\/#center\">center<\/a>, and <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/references\/map-components\/arcgis-map\/#zoom\">zoom<\/a>, depending on your workflow. Avoid re-creating the map unnecessarily, and load tools like an <code>&lt;<span style=\"color: #e36209\">arcgis<\/span>-<span style=\"color: #e36209\">legend<\/span>&gt;<\/code> or <code>&lt;<span style=\"color: #e36209\">arcgis<\/span>-<span style=\"color: #e36209\">layer-list<\/span>&gt;<\/code>, only when needed. These strategies can dramatically reduce your widget\u2019s initialization time.<\/p>\n"},{"acf_fc_layout":"content","content":"<h2>Use Jimu, Calcite, and Map component libraries together<\/h2>\n<p><span class=\"TextRun SCXW84544565 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW84544565 BCX0\">To <\/span><span class=\"NormalTextRun SCXW84544565 BCX0\">show<\/span><span class=\"NormalTextRun SCXW84544565 BCX0\"> how these <\/span><span class=\"NormalTextRun SCXW84544565 BCX0\">component<\/span><span class=\"NormalTextRun SCXW84544565 BCX0\"> systems can work together, listed below<\/span><span class=\"NormalTextRun SCXW84544565 BCX0\"> is an example using <\/span><\/span><strong><span class=\"TextRun SCXW84544565 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW84544565 BCX0\">Jimu UI<\/span><\/span><\/strong><span class=\"TextRun SCXW84544565 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW84544565 BCX0\">, <\/span><\/span><strong><span class=\"TextRun SCXW84544565 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW84544565 BCX0\">Calcite<\/span><\/span><\/strong><span class=\"TextRun SCXW84544565 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW84544565 BCX0\">, and <\/span><\/span><strong><span class=\"TextRun SCXW84544565 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW84544565 BCX0\">Map components<\/span><\/span><\/strong><span class=\"TextRun SCXW84544565 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW84544565 BCX0\"> in one widget:<\/span><\/span><span class=\"EOP SCXW84544565 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<pre><code><span style=\"color: #6a737d\">\/\/ A legend toggle panel using Jimu UI, Calcite and Map components <\/span>\r\n<span style=\"color: #d73a49\">import<\/span> { <span style=\"color: #6f42c1\">React<\/span>, useState, <span style=\"color: #d73a49\">type<\/span> <span style=\"color: #6f42c1\">AllWidgetProps<\/span> } <span style=\"color: #d73a49\">from<\/span> <span style=\"color: #032f62\">'jimu-core'<\/span>\r\n<span style=\"color: #d73a49\">import<\/span> { <span style=\"color: #6f42c1\">JimuMapViewComponent<\/span>, <span style=\"color: #d73a49\">type<\/span> <span style=\"color: #6f42c1\">JimuMapView<\/span> } <span style=\"color: #d73a49\">from<\/span> <span style=\"color: #032f62\">'jimu-arcgis'<\/span>\r\n<span style=\"color: #d73a49\">import<\/span> { <span style=\"color: #6f42c1\">Switch<\/span> } <span style=\"color: #d73a49\">from<\/span> <span style=\"color: #032f62\">'jimu-ui'<\/span>\r\n<span style=\"color: #d73a49\">import<\/span> { <span style=\"color: #6f42c1\">CalcitePanel<\/span> } <span style=\"color: #d73a49\">from<\/span> <span style=\"color: #032f62\">'calcite-components'<\/span>\r\n<span style=\"color: #d73a49\">import<\/span> <span style=\"color: #032f62\">'arcgis-map-components'<\/span>\r\n\r\n<span style=\"color: #d73a49\">const<\/span> <span style=\"color: #6f42c1\">Widget<\/span> = (<span style=\"color: #005cc5\">props<\/span>: <span style=\"color: #6f42c1\">AllWidgetProps<\/span>&lt;<span style=\"color: #e36209\">object<\/span>&gt;) =&gt; {\r\n  <span style=\"color: #d73a49\">const<\/span> [visible, setVisible] = <span style=\"color: #6f42c1\">useState<\/span>(<span style=\"color: #005cc5\">true<\/span>);\r\n  <span style=\"color: #d73a49\">const<\/span> legendRef = <span style=\"color: #6f42c1\">React<\/span>.<span style=\"color: #6f42c1\">useRef<\/span>(<span style=\"color: #005cc5\">null<\/span>)\r\n  <span style=\"color: #d73a49\">const<\/span> <span style=\"color: #6f42c1\">onActiveViewChange<\/span> = (<span style=\"color: #005cc5\">activeView<\/span>: <span style=\"color: #6f42c1\">JimuMapView<\/span>) =&gt; {\r\n    <span style=\"color: #d73a49\">if<\/span> (!activeView || !legendRef.current) {\r\n<span style=\"color: #d73a49\">      return<\/span>\r\n    }\r\n    legendRef.current.view = activeView.view\r\n  } \r\n  <span style=\"color: #d73a49\">return<\/span> ( \r\n    {<span style=\"color: #6a737d\">\/* Calcite Panel for the Jimu UI and Map components *\/<\/span>} \r\n    &lt;calcite-panel heading=<span style=\"color: #032f62\">\"Map View\"<\/span>&gt; \r\n      {<span style=\"color: #6a737d\">\/* Jimu UI Switch for toggling legend visibility *\/<\/span>} \r\n      &lt;<span style=\"color: #6f42c1\">Switch<\/span> checked={visible} onChange={() =&gt; <span style=\"color: #6f42c1\">setVisible<\/span>(v =&gt; !v)} \/&gt;\r\n      {<span style=\"color: #6a737d\">\/* Initialize Legend component on active view change event *\/<\/span>}\r\n      &lt;<span style=\"color: #6f42c1\">JimuMapViewComponent<\/span> onActiveViewChange={onActiveViewChange} \r\n                            useMapWidgetId={props.useMapWidgetIds[<span style=\"color: #005cc5\">0<\/span>]}&gt;\r\n      &lt;\/<span style=\"color: #6f42c1\">JimuMapViewComponent<\/span>&gt;\r\n      {<span style=\"color: #6a737d\">\/* Legend component displayed when visible *\/<\/span>}\r\n      {visible &amp;&amp; &lt;<span style=\"color: #22863a\">arcgis-legend<\/span> <span style=\"color: #005cc5\">ref<\/span>=<span style=\"color: #032f62\">{legendRef}<\/span>&gt;&lt;\/<span style=\"color: #22863a\">arcgis-legend<\/span>&gt;}\r\n    &lt;\/calcite-panel&gt;\r\n  ); \r\n}\r\n<span style=\"color: #d73a49\">export<\/span> <span style=\"color: #d73a49\">default<\/span> <span style=\"color: #6f42c1\">Widget<\/span>\r\n<\/code><\/pre>\n<p>This custom widget shows how you can use Jimu UI for interaction, Calcite for layout, and the <a href=\"https:\/\/developers.arcgis.com\/documentation\/app-builders\/low-code\/arcgis-experience-builder\/use-map-components-in-custom-widget\/\">Map component APIs<\/a> for display\u2014all with minimal overhead. To explore further, check out additional <a href=\"https:\/\/github.com\/Esri\/arcgis-experience-builder-sdk-resources\/tree\/master\/widgets\">Experience Builder widget examples<\/a>.<\/p>\n"},{"acf_fc_layout":"content","content":"<h2 id=\"keep-styling-consistent\">Keep styling consistent<\/h2>\n<p><span class=\"TextRun SCXW84172791 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW84172791 BCX0\">Experience Builder already has a robust theming system. Instead of adding your own CSS, use <\/span><\/span><a class=\"Hyperlink SCXW84172791 BCX0\" href=\"https:\/\/developers.arcgis.com\/documentation\/app-builders\/low-code\/arcgis-experience-builder\/jimu-ui-components-in-a-custom-widget\/#styling-components\" target=\"_blank\" rel=\"noreferrer noopener\"><span class=\"TextRun Underlined SCXW84172791 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW84172791 BCX0\" data-ccp-charstyle=\"Hyperlink\">Jimu UI&#8217;s emotion-based styling system<\/span><\/span><\/a><span class=\"TextRun SCXW84172791 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW84172791 BCX0\"> so your widget matches the app theme automatically.<\/span><\/span><\/p>\n<pre><code><span style=\"color: #6a737d\">\/* @jsx jsx *\/<\/span> \r\n<span style=\"color: #d73a49\">import<\/span> { jsx, css } <span style=\"color: #d73a49\">from<\/span> <span style=\"color: #032f62\">'jimu-core'<\/span>\r\n<span style=\"color: #d73a49\">const<\/span> panelStyle = css` \r\n\u202f <span style=\"color: #005cc5\">padding<\/span>: <span style=\"color: #005cc5\">1rem<\/span>; \r\n\u202f <span style=\"color: #005cc5\">color<\/span>: <span style=\"color: #e36209\">var<\/span>(--dark);\r\n`; \r\n<span style=\"color: #6a737d\">\/\/ Apply with the `css` prop: <\/span>\r\n&lt;<span style=\"color: #22863a\">div<\/span> <span style=\"color: #005cc5\">css<\/span>=<span style=\"color: #032f62\">{panelStyle}<\/span>&gt;Your content here&lt;\/<span style=\"color: #22863a\">div<\/span>&gt;\r\n<\/code><\/pre>\n<p><span class=\"TextRun SCXW166563787 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW166563787 BCX0\">When using Calcite C<\/span><span class=\"NormalTextRun SCXW166563787 BCX0\">omponents, rely on CSS custom properties rather than global overrides:<\/span><\/span><span class=\"EOP SCXW166563787 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<pre><code>calcite-<span style=\"color: #22863a\">button<\/span> { \r\n\u202f <span style=\"color: #005cc5\">--calcite-color-brand<\/span>: <span style=\"color: #e36209\">var<\/span>(--primary-color);\r\n} \r\n<\/code><\/pre>\n<p><span class=\"TextRun SCXW58255617 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW58255617 BCX0\">These CSS custom properties also apply to Map components, allowing you to override styles globally or on individual components. <\/span><\/span><\/p>\n<p><span class=\"TextRun SCXW58255617 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW58255617 BCX0\">The <\/span><\/span><a class=\"Hyperlink SCXW58255617 BCX0\" href=\"https:\/\/developers.arcgis.com\/documentation\/app-builders\/low-code\/arcgis-experience-builder\/calcite-components-in-a-custom-widget\/#theming-with-design-tokens\" target=\"_blank\" rel=\"noreferrer noopener\"><span class=\"TextRun Underlined SCXW58255617 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW58255617 BCX0\" data-ccp-charstyle=\"Hyperlink\">Calcite Components design token reference<\/span><\/span><\/a><span class=\"TextRun SCXW58255617 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW58255617 BCX0\"> provides examples for aligning your widget\u2019s look and feel with Esri\u2019s color, typography, and spacing standards.<\/span><\/span><span class=\"LineBreakBlob BlobObject DragDrop SCXW58255617 BCX0\"><span class=\"SCXW58255617 BCX0\">\u00a0<\/span><br class=\"SCXW58255617 BCX0\" \/><\/span><span class=\"TextRun SCXW58255617 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW58255617 BCX0\">When referencing Calcite web components in JSX or HTML, use the <\/span><\/span><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Glossary\/Kebab_case\"><span class=\"TextRun SCXW58255617 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW58255617 BCX0\">kebab-case naming convention<\/span><\/span><\/a>, where words are separated by hyphens (<span class=\"TextRun SCXW58255617 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW58255617 BCX0\"><code><span style=\"color: #e36209\">-<\/span><\/code><\/span><\/span>) and characters are lowercase.<span class=\"TextRun SCXW58255617 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW58255617 BCX0\"> For instance, <\/span><\/span><span class=\"TextRun SCXW58255617 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW58255617 BCX0\"><code>&lt;<span style=\"color: #e36209\">calcite-button<\/span>&gt;<\/code>,<\/span><\/span><span class=\"TextRun SCXW58255617 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW58255617 BCX0\"> rather than <code><span style=\"color: #6f42c1\">CalciteButton<\/span><\/code><\/span><\/span><span class=\"TextRun SCXW58255617 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW58255617 BCX0\">.<\/span><\/span><span class=\"EOP SCXW58255617 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n"},{"acf_fc_layout":"content","content":"<h2>Deployment tips<\/h2>\n<p><span data-contrast=\"auto\">ArcGIS Experience Builder ships with specific versions of Jimu UI, Calcite, and Map components. If you import newer or mismatched versions, you may see console warnings or missing icons. Before upgrading, check the supported versions in <\/span><span data-ccp-props=\"{}\">the <a href=\"https:\/\/developers.arcgis.com\/experience-builder\/guide\/whats-new\/\">latest Experience Builder release notes<\/a>.\u00a0<\/span><\/p>\n<p><span class=\"TextRun SCXW11511451 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW11511451 BCX0\">Before deploying,\u00a0<\/span><span class=\"NormalTextRun SCXW11511451 BCX0\">it is recommended to<\/span><span class=\"NormalTextRun SCXW11511451 BCX0\">\u00a0profi<\/span><span class=\"NormalTextRun SCXW11511451 BCX0\">le<\/span><span class=\"NormalTextRun SCXW11511451 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW11511451 BCX0\">your widget.\u00a0<\/span><span class=\"NormalTextRun SCXW11511451 BCX0\">For example, you can o<\/span><span class=\"NormalTextRun SCXW11511451 BCX0\">pen\u00a0<\/span><\/span><a class=\"Hyperlink SCXW11511451 BCX0\" href=\"https:\/\/developer.chrome.com\/docs\/devtools\" target=\"_blank\" rel=\"noreferrer noopener\"><span class=\"TextRun Underlined SCXW11511451 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW11511451 BCX0\" data-ccp-charstyle=\"Hyperlink\">Chrome DevTools<\/span><\/span><\/a><span class=\"TextRun SCXW11511451 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW11511451 BCX0\">, record a performance trace, and look for long scripting or paint times<\/span><span class=\"NormalTextRun SCXW11511451 BCX0\">\u00a0when interacting with your widget<\/span><span class=\"NormalTextRun SCXW11511451 BCX0\">. Most performance issues<\/span><span class=\"NormalTextRun SCXW11511451 BCX0\">\u00a0include<\/span><span class=\"NormalTextRun SCXW11511451 BCX0\">:<\/span><\/span><span class=\"EOP SCXW11511451 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<ul>\n<li><span class=\"TextRun SCXW201865739 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW201865739 BCX0\">Non-relevant<\/span><span class=\"NormalTextRun SCXW201865739 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW201865739 BCX0\">imports<\/span><\/span><span class=\"EOP SCXW201865739 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">Redundant map initialization<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">Overuse of third-party dependencies<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<p><span class=\"TextRun SCXW265276842 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW265276842 BCX0\">It is also recommended to<\/span><span class=\"NormalTextRun SCXW265276842 BCX0\">\u00a0<\/span><span class=\"NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW265276842 BCX0\">test in<\/span><span class=\"NormalTextRun SCXW265276842 BCX0\">\u00a0both preview and production modes.\u00a0<\/span><span class=\"NormalTextRun SCXW265276842 BCX0\">P<\/span><span class=\"NormalTextRun SCXW265276842 BCX0\">roduction build<\/span><span class=\"NormalTextRun SCXW265276842 BCX0\">s<\/span><span class=\"NormalTextRun SCXW265276842 BCX0\">\u00a0use<\/span><span class=\"NormalTextRun SCXW265276842 BCX0\">\u00a0minified assets and\u00a0<\/span><span class=\"NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW265276842 BCX0\">optimized<\/span><span class=\"NormalTextRun SCXW265276842 BCX0\">\u00a0React behavior, which can change performance characteristics.<\/span><\/span><span class=\"EOP SCXW265276842 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">For TypeScript-based widgets, the default in Experience Builder, the same principles apply in your <\/span><code><span style=\"color: #032f62\">.tsx<\/span><\/code><span data-contrast=\"auto\"> files in the <\/span><a href=\"https:\/\/developers.arcgis.com\/experience-builder\/guide\/install-guide\/\">ArcGIS Experience Builder Developer Edition<\/a><span data-contrast=\"auto\"> widgets directory.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n"},{"acf_fc_layout":"content","content":"<h2>Conclusion<\/h2>\n<p><span data-contrast=\"auto\">Custom widgets are one of the best parts of ArcGIS Experience Builder because they let you go beyond templates and build exactly what your app needs. The trick is to balance flexibility with performance.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">By keeping imports modular, managing React state carefully, reusing map views, and styling through Experience Builder\u2019s theme system, you can create widgets that look great and perform smoothly.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n"},{"acf_fc_layout":"content","content":"<p>For more details, explore the official documentation for the libraries:<\/p>\n<table style=\"border-collapse: collapse;width: 100%\">\n<thead style=\"background-color: #007ac2;color: white\">\n<tr>\n<td><strong>Library<\/strong><\/td>\n<td><strong>Purpose<\/strong><\/td>\n<td><strong>Key Optimization<\/strong><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"background-color: #f2f2f2\">\n<td><a href=\"https:\/\/developers.arcgis.com\/documentation\/app-builders\/low-code\/arcgis-experience-builder\/jimu-ui-components-in-a-custom-widget\/\"><strong>Jimu UI<\/strong><\/a><\/td>\n<td>React UI for Experience Builder<\/td>\n<td>Import specific components (or advanced ones from jimu-ui\/advanced)<\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/developers.arcgis.com\/documentation\/app-builders\/low-code\/arcgis-experience-builder\/calcite-components-in-a-custom-widget\/\"><strong>Calcite Components<\/strong><\/a><\/td>\n<td><span class=\"TextRun SCXW214527358 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW214527358 BCX0\">Esri\u2019s design system\u00a0<\/span><span class=\"NormalTextRun SCXW214527358 BCX0\">comprised<\/span><span class=\"NormalTextRun SCXW214527358 BCX0\">\u00a0of web component<\/span><span class=\"NormalTextRun SCXW214527358 BCX0\">s<\/span><\/span><span class=\"EOP SCXW214527358 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<td>Lazy-load large components, use kebab-case<\/td>\n<\/tr>\n<tr style=\"background-color: #f2f2f2\">\n<td><a href=\"https:\/\/developers.arcgis.com\/documentation\/app-builders\/low-code\/arcgis-experience-builder\/use-map-components-in-custom-widget\/\"><strong>Map components<\/strong><\/a><\/td>\n<td><span class=\"TextRun SCXW19226133 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW19226133 BCX0\">ArcGIS Maps SDK for JavaScript web components for maps, layers, and tools<\/span><span class=\"NormalTextRun SCXW19226133 BCX0\"> built with Calcite Components.<\/span><\/span><span class=\"EOP CommentStart CommentHighlightPipeRest PointComment CommentHighlightRest SCXW19226133 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<td>Reuse the same view instance, configure with item-id or basemap options<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span class=\"TextRun SCXW70413222 BCX0\" lang=\"EN-US\" xml:lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW70413222 BCX0\">Good widget performance\u00a0<\/span><span class=\"NormalTextRun SCXW70413222 BCX0\">isn\u2019t<\/span><span class=\"NormalTextRun SCXW70413222 BCX0\">\u00a0just about\u00a0<\/span><span class=\"NormalTextRun ContextualSpellingAndGrammarErrorV2Themed SCXW70413222 BCX0\">speed,<\/span><span class=\"NormalTextRun SCXW70413222 BCX0\">\u00a0<\/span><span class=\"NormalTextRun SCXW70413222 BCX0\">it\u2019s<\/span><span class=\"NormalTextRun SCXW70413222 BCX0\">\u00a0about writing clean,\u00a0<\/span><span class=\"NormalTextRun SCXW70413222 BCX0\">optimized\u00a0<\/span><span class=\"NormalTextRun SCXW70413222 BCX0\">code that scales as your\u00a0<\/span><span class=\"NormalTextRun SCXW70413222 BCX0\">ArcGIS\u00a0<\/span><span class=\"NormalTextRun SCXW70413222 BCX0\">Experience Builder apps grow.<\/span><\/span><span class=\"EOP SCXW70413222 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">If you are new to ArcGIS development, you can get started by signing up for a free\u00a0<a href=\"https:\/\/location.arcgis.com\/sign-up\/\">ArcGIS Location Platform accoun<\/a>t<\/span><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:1,&quot;335551620&quot;:1,&quot;335559738&quot;:0,&quot;335559739&quot;:240}\">\u00a0Also, stay in the loop with the latest in developer technology by subscribing to the\u00a0<a href=\"https:\/\/go.esri.com\/subscribe\" target=\"_blank\" rel=\"noopener\">Esri Developer Newsletter.<\/a><\/span><\/p>\n"}],"show_article_image":false,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/Card_-826px-x-465px.png","wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/Banner_-1920px-x-1080px.png","related_articles":""},"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>Optimizing Custom Widgets in ArcGIS Experience Builder with Jimu UI, Calcite, and Map Components<\/title>\n<meta name=\"description\" content=\"Optimize ArcGIS Experience Builder widgets with Jimu UI, Calcite, and Map components for scalable GIS app performance.\" \/>\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\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Optimizing Custom Widgets in ArcGIS Experience Builder with Jimu UI, Calcite, and Map Components\" \/>\n<meta property=\"og:description\" content=\"Optimize ArcGIS Experience Builder widgets with Jimu UI, Calcite, and Map components for scalable GIS app performance.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components\" \/>\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=\"2025-11-17T17:55:41+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=\"7 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\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components\"},\"author\":{\"name\":\"Kitty Hurley\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/1d3e2f690ee8951f6625010e5b55aee8\"},\"headline\":\"Optimizing Custom Widgets in ArcGIS Experience Builder with Jimu UI, Calcite, and Map Components\",\"datePublished\":\"2025-11-17T15:00:27+00:00\",\"dateModified\":\"2025-11-17T17:55:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components\"},\"wordCount\":14,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"Calcite Design System\"],\"articleSection\":[\"Developers\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components\",\"name\":\"Optimizing Custom Widgets in ArcGIS Experience Builder with Jimu UI, Calcite, and Map Components\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2025-11-17T15:00:27+00:00\",\"dateModified\":\"2025-11-17T17:55:41+00:00\",\"description\":\"Optimize ArcGIS Experience Builder widgets with Jimu UI, Calcite, and Map components for scalable GIS app performance.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Optimizing Custom Widgets in ArcGIS Experience Builder with Jimu UI, Calcite, and Map Components\"}]},{\"@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":"Optimizing Custom Widgets in ArcGIS Experience Builder with Jimu UI, Calcite, and Map Components","description":"Optimize ArcGIS Experience Builder widgets with Jimu UI, Calcite, and Map components for scalable GIS app performance.","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\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components","og_locale":"en_US","og_type":"article","og_title":"Optimizing Custom Widgets in ArcGIS Experience Builder with Jimu UI, Calcite, and Map Components","og_description":"Optimize ArcGIS Experience Builder widgets with Jimu UI, Calcite, and Map components for scalable GIS app performance.","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2025-11-17T17:55:41+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","twitter_misc":{"Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components"},"author":{"name":"Kitty Hurley","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/1d3e2f690ee8951f6625010e5b55aee8"},"headline":"Optimizing Custom Widgets in ArcGIS Experience Builder with Jimu UI, Calcite, and Map Components","datePublished":"2025-11-17T15:00:27+00:00","dateModified":"2025-11-17T17:55:41+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components"},"wordCount":14,"commentCount":0,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["Calcite Design System"],"articleSection":["Developers"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components","name":"Optimizing Custom Widgets in ArcGIS Experience Builder with Jimu UI, Calcite, and Map Components","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2025-11-17T15:00:27+00:00","dateModified":"2025-11-17T17:55:41+00:00","description":"Optimize ArcGIS Experience Builder widgets with Jimu UI, Calcite, and Map components for scalable GIS app performance.","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Optimizing Custom Widgets in ArcGIS Experience Builder with Jimu UI, Calcite, and Map Components"}]},{"@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":"November 17, 2025","author_name":"Multiple Authors","author_page":"https:\/\/www.esri.com\/arcgis-blog\/products\/experience-builder\/developers\/optimizing-custom-widgets-in-arcgis-experience-builder-with-jimu-ui-calcite-and-map-components","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/10\/Banner_-1920px-x-1080px.png","primary_product":"ArcGIS Experience Builder","tag_data":[{"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"}],"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":400032,"name":"ArcGIS Experience Builder","slug":"experience-builder","term_group":0,"term_taxonomy_id":400032,"taxonomy":"product","description":"","parent":36591,"count":161,"filter":"raw"},{"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"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=experience-builder","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2946387","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=2946387"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2946387\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=2946387"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=2946387"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=2946387"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=2946387"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=2946387"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}