UX & UI Tips for Map Apps

   <Allan_Laframboise class='front-end developer'/>
       <Alan_Sangma class='design engineer'/>


What is Calcite?

Design system created at ESRI


"Style guide, branding guidelines, geo-centric..."



  • Color is meaningful
  • Icons are purposeful
  • UX is foundational
  • UI is impactful






ArcGIS Pro

Calcite Web

Calcite Web

  • CSS web framework developed by Esri
  • Based on Calcite - colors, fonts, icons
  • Branding guide, developer style guide
  • Built with SASS
  • Documentation




Learn more...

Calcite Bootstrap

Calcite Bootstrap

  • Calcite theme and a custom build for Bootstrap
  • Calcite colors, styles and fonts
  • Light and dark themes
  • Built with SASS
  • Additional features...

Calcite Dojo

ArcGIS JS 3.16

  • Calcite theme for the ArcGIS API for JS
  • Widgets - zoom, home, popup...

ArcGIS JS 4.x

  • Default for 4.x
  • Rethinking UX and UI
  • Developer interface

Calcite Maps

Calcite Maps

Modern framework for designing map apps with Bootstrap

  • Calcite-Bootstrap
  • Calcite styles & colors
  • Map-app friendly
  • Custom Sass build
  • Open Source

Not Web App Builder or an App Template!

Getting Started (v0.0.2)

  • Custom build
  • Sass, Themes, APIs
  • DOM and CSS
  • Styler

Custom Build

fork - npm - bower - grunt

Sass, Themes, APIs

map-position.scss, navbar.scss, panel.scss...



slide extras

CSS Selector Guide

Map and Nav Layout

  • Map
    • .map-position-absolute, .map-position-relative
  • Nav
    • .nav-position-top, .nav-position-bottom
    • nav-space-none, .nav-space-top, .nav-space-bottom, ​.nav-space-all
<body class="calcite-maps map-position-absolute nav-position-top nav-space-top">

Navbar Header

  • Brand and title
    • .esri-icon .esri-icon-layer
    • .navbar-brand, .navbar-info
  • Collapsible 
<div class="navbar-header">
    <a class="navbar-brand">
       <span class="esri-icon esri-icon-layers"></span>
    <div class="navbar-info">
        <div class="navbar-title text-overflow">Calcite Maps</div>
        <div class="navbar-subtitle text-overflow">A framework for designing beautiful map apps</div> 

Navbar Colors and Themes

  • .calcite-gray, .calcite-gray-25, .calcite-gray-50...
  • .navbar-text-dark, .navbar-text-light
<body class="calcite-maps map-position-absolute nav-position-top nav-space-none panel-right">

    <nav class="navbar navbar-fixed-top navbar-text-light calcite-dark-blue">

Navigation - Primary

  • Main menus, tab and form controls
  • E.g. Map, Scene and Search
<ul class="nav navbar-nav navbar-right">                    
    <!-- Map and Scene - NOTE: Removed on mobile devices due to 3D support -->
    <li class="active"><a id="mapNav" class="hidden-xs hidden-sm" href="#2dTab" aria-controls="2Dtab" aria-expanded="true" role="tab" data-toggle="tab" data-tooltip="tip" data-placement="bottom" data-dojo-dataid="pid0" data-original-title="2D View">Map</a></li>
    <li><a id="sceneNav" class="hidden-xs hidden-sm" href="#3dTab" aria-controls="3Dtab" role="tab" data-toggle="tab" data-tooltip="tip" data-placement="bottom" data-dojo-dataid="pid1" data-original-title="3D View">Scene</a></li>                  
    <li><form id="searchNav" class="navbar-form navbar-search hidden-xs visible-sm visible-md visible-lg"></form></li>

Navigation - Secondary

  • Dropdown menu with all "options"
  • Show and hide panels (data-target)
<ul class="dropdown-menu">
    <li><a id="mapNavMenu" class="hidden-xs visible-sm hidden-md hidden-lg" href="#2dTab" aria-controls="2Dtab" role="tab" data-toggle="tab">Map</a></li>
    <li><a id="sceneNavMenu" class="hidden-xs visible-sm hidden-md hidden-lg" href="#3dTab" aria-controls="3Dtab" role="tab" data-toggle="tab">Scene</a></li>
    <li><a id="infoNavMenu" role="button" data-target="#panelInfo" aria-haspopup="true"><span class="glyphicon glyphicon-info-sign"></span> Info</a></li>
    <li><a id="searchNavMenu" class="visible-xs" role="button" data-target="#panelSearch" aria-haspopup="true"><span class="glyphicon glyphicon-search"></span> Search</a></li>
    <li><a id="basemapsNavMenu" role="button" data-target="#panelBasemaps" aria-haspopup="true"><span class="glyphicon glyphicon-th-large"></span> Basemaps</a></li>
    <li><a id="bookmarksNavMenu" role="button" data-target="#panelBookmarks" aria-haspopup="true"><span class="glyphicon glyphicon-book"></span> Bookmarks</a></li>
    <li><a id="legendNavMenu" role="button" data-target="#panelLegend" aria-haspopup="true"><span class="glyphicon glyphicon-list"></span> Legend</a></li>

Accordion Panels

  • Collapseable windows
  • E.g. Info, Basemaps, Search, Legend, Bookmarks...
<div id="panelAccordion" class="panel-group" role="tablist" aria-multiselectable="true">
    <div id="panelInfo" class="panel panel-default collapse" data-dojo-dataid="pid18" style="height: 0px;">
        <div id="headingInfo" class="panel-heading" role="tab">
            <div class="panel-title">
                <a class="panel-toggle" role="button" data-toggle="collapse" href="#collapseInfo" data-parent="#panelAccordion" aria-expanded="true" aria-controls="collapseInfo" data-dojo-dataid="pid19"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> Info</a>
                <a class="panel-close" role="button" data-toggle="collapse" data-target="#panelInfo" data-dojo-dataid="pid29"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></a>  
        <div id="collapseInfo" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingInfo" data-dojo-dataid="pid20" style="height: 0px;">
            <div class="panel-body">
                <p>This is a great place to describe what your application is about and why it's important.</p>

Map Widgets

  • Position with CSS or programmatically
// ArcGIS JS 4.x - view and ui padding

mapView = new MapView({
     container: "mapViewDiv",
     map: map,
     center: app.lonlat,
     zoom: app.zoom,
     padding: {top: 64},
     ui: {
         components: ["zoom"],
         padding: {top: 15, left: 15, bottom: 30, right: 15}


  • Position with CSS or programmatically
// ArcGIS JS 4.x - popup dock properties

mapView = new MapView({
    map: map

    mapView.popup.dockOptions = {
        buttonEnabled: true,
        breakpoint: false,
        position: "bottom"

Custom Themes

Why Calcite Maps?

  • Custom build system for creating map apps with Bootstrap
  • Calcite styles, colors, fonts and themes for map apps
  • Small, fast, light-weight, fully customizable
  • Great for styling and prototyping
  • Fully integrated with ArcGIS JS 4.x
  • Open source

This is not WAB or an App Template!

Thank you!

Calcite Maps

By alaframboise

Calcite Maps

  • 4,859