← Back to Blog

calcite-shell decides where things go, not when they move — the Calcite 5.x layout frame, and the small-screen code it leaves to you

A desktop browser layout built from calcite-shell regions: header, left action bar, a side panel of list items, a map, a floating dialog and a footer, with the detached pieces linked alongside. At the center, a breakpoint node between a monitor and a phone icon sits above a code block. On the right, the same app as two phones; the upper one keeps the desktop side panel and is marked with a grey cross, the lower one collapses it into a sheet over the map and is marked with a blue check.

Every one of the 30 ATS builds that declare @esri/calcite-components in their package.json ships calcite-shell. Twenty-three of them also ship their own matchMedia code. That second number is the subject of this post. The shell is a layout frame: it puts a header, a footer, up to four shell-panels and your map in fixed, named places, and it keeps slotted dialogs, alerts and sheets inside its own box. In Esri’s words, it “doesn’t automatically hide content within slots on smaller screens.” Every change to where the shell’s panels sit, or whether they are open, is code you write.

Everything below was checked against the Calcite documentation and run in headless Chrome on Calcite 5.0.2 and 5.1.2 on October 12, 2026. 5.0.2 is the version the ArcGIS Maps SDK for JavaScript 5.0 CDN entry loads, and 5.1.2 is the current release on npm. The published API of the shell and the shell-panel is identical in the two versions, so what follows applies to both. Where a statement rests on our own test rather than on Esri’s documentation, the text says so.

What we counted. An “ATS build” here is a project folder whose package.json declares @esri/calcite-components: 30 of them, 12 in our labs folder and 18 in our Calcite app folder. Apps that load Calcite only from the CDN are not counted. Of the 30, 28 also use calcite-shell-panel; the other two use the shell with a header only.

What the shell is: ten named regions

Esri describes Shell as “a foundational layout component in Calcite.” It can fill the page, or it can be “given defined width and height to enable you to embed applications in other experiences or narrative content.” It is not the “app shell” of progressive web apps: nothing on its page concerns caching, offline use or service workers. It is a set of slots.

At 5.x the shell has exactly ten documented slots. The 5.1.2 type declarations carry the same ten, and in our test the 5.0.2 and 5.1.2 shells exposed all ten as slots (plus an undocumented modals, below).

SlotWhat goes there
(default)Your center content. Esri: “This content will appear between any leading and trailing panels added to the component, such as a map.”
header, footerNavigation and global actions. They “stay pinned while the main content is interacted with.”
panel-start, panel-end, panel-top, panel-bottomOne calcite-shell-panel each.
dialogs, alerts, sheetsOverlays that stay inside the shell (see below).

The shell itself has one property, contentBehind, which “positions the center content behind any calcite-shell-panels.” In our test, a 240 px docked panel in an 800 px shell left the center content 560 px wide; with contentBehind set, the center content took the full 800 px and the panel sat on top of it. The shell fires no events and has no methods beyond componentOnReady. The docs do not say that contentBehind moves anything inside a map, such as its zoom buttons. In our Aurora Watch app we offset the map’s top-left controls by hand. If you set contentBehind, check where your map’s controls end up.

One more name that misleads: the header slot is a place, not a landmark. It positions content “at the top of the component.” The accessibility section below says what that means.

Panels are placed by slot, not by property

A shell-panel is “expected to be used within the ‘panel-start’, ‘panel-end’, ‘panel-top’, and ‘panel-bottom’ slots of Shell.” The slot decides where it goes. Its position and layout properties were deprecated in 5.0.0, with a removal target of 6.0.0, and the reason given for both is “No longer necessary.” In our test, a panel written as slot="panel-end" position="start" rendered at the end, and its position property read back "end".

Do not confuse calcite-shell-panel with calcite-panel. The shell-panel “defines a dockable or floating region within a Shell.” The panel groups UI and “can be used independently or within a Shell or Shell Panel.” Esri’s expected pattern is one inside the other: “It is expected to slot a single Panel, most often containing one or more Block components, inside the Shell Panel,” and, as “a common use case,” an Action Bar in the shell-panel’s action-bar slot.

How a shell-panel sits next to the center content is its displayMode:

Esri notes that the display modes look “slightly different” depending on the shell’s contentBehind.

resizable needs care, because the sources disagree. The property text on the shell-panel page still reads “When true and displayMode is ‘dock’ or ‘overlay’, the component’s content area is resizable.” The May 2025 release summary added float: “Panels can now be resized when displayMode is ‘float’.” The component changelog says the change allowed resizing “for all displayMode values.” In our test on 5.1.2, the resize handle rendered in all five modes.

Three more shell-panel facts that are easy to miss on its documentation page:

Overlays that stay inside the box

The three overlay slots are what make an embedded shell work. Esri: “For example, you can display a Dialog within the bounds of an embedded Shell without it taking over the whole page.” We tested it against the same dialog placed outside the slot. In a 1200 × 800 page holding an 800 × 500 shell, a dialog in the dialogs slot rendered exactly inside the shell’s box. The same dialog outside the slot covered the whole viewport.

The docs give alerts and sheets the same rule: each, “when placed in this slot,” is “constrained to the extent of the calcite-shell.” We tested only the dialog.

What the shell does not do: adapt to small screens

This is the sentence the post is built on, from the Shell page:

“Shell doesn’t automatically hide content within slots on smaller screens, instead it must be managed programmatically with JavaScript. For instance, programmatically setting collapsed=‘true’ on a Shell Panel when the viewport is under a certain width.”

We measured what that means on a phone. A shell with a 240 px docked panel, loaded at a 375 px viewport with no script, kept the panel open and left the map 135 px wide. The shell did nothing. The same page with a few lines of script collapsed the panel and gave the map all 375 px.

If you are not the one writing the code. Using Calcite does not, by itself, make an app built on calcite-shell mobile-ready. Unless someone wrote the small-screen code, the side panel keeps its desktop width on a phone and the map gets what is left: 135 px of a 375 px screen in our test. Collapsing the panel is a few lines of code. Giving users a way to reopen it, and checking it with a keyboard and a screen reader at that width, is the part that takes testing. Before you sign off, ask to see the app at phone width and ask how a user gets a collapsed panel back. The gap is easy to miss on a desktop monitor.

Esri files moving shell-panels by screen size under adaptive design, the programmatic kind, and lists “Slot relocation: Programmatically move a Shell Panel from Shell’s ‘panel-start’ slot to the ‘panel-bottom’ slot based on screen size.” Responsive design, in the same guide, means components with “internal logic … used to automatically adjust the display and functionality based on the available width.” The examples it gives are Action Bar, Carousel and Card Group. That is an example list, not a complete one.

Action Bar matters here, because it lives inside a shell-panel: by default it “dynamically collapses Actions into an ellipsis overflow menu” on its own. So the code you write is about where the shell-panels sit and whether they are open, not about everything inside them.

Esri’s Shell and Shell Panel pages suggest three moves for small screens:

The minimum we measured, not a pattern to ship

Read this before you copy it. This sample is the minimum, not the finished pattern. A collapsed shell-panel with no action bar measured 0 px wide in our test, so on a narrow screen there is nothing left to click to bring it back. A user on a phone, and any keyboard or screen-reader user, loses the panel’s content entirely. Before you ship it, give users a way to reopen the panel. Esri’s Shell Panel page names an Action Bar in the shell-panel’s action-bar slot as “a common use case”; we did not measure how a collapsed panel behaves with one.

This is the page we tested: a minimal page, not Aurora Watch’s own code. Loaded at 1200 px, the panel is open at 240 px and the map is 960 px wide. Loaded at 375 px, the script collapses the panel and the map gets the full width. The 600 px threshold is simply the one we tested. If your page also loads the ArcGIS Maps SDK for JavaScript 5.0 CDN entry, note that the entry already loads Calcite 5.0.2, while this sample loads 5.1.2; we did not test the two together on one page.

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Shell layout</title>
  <script type="module" src="https://js.arcgis.com/calcite-components/5.1.2/index.js"></script>
  <link rel="stylesheet" href="https://js.arcgis.com/calcite-components/5.1.2/main.css">
  <style>html, body { margin: 0; height: 100%; } #view { width: 100%; height: 100%; }</style>
</head>
<body>
  <calcite-shell id="shell">
    <calcite-navigation slot="header">
      <calcite-navigation-logo slot="logo" heading="Aurora Watch"></calcite-navigation-logo>
    </calcite-navigation>
    <calcite-shell-panel slot="panel-start" id="ps" display-mode="dock" resizable>
      <calcite-panel heading="Layers" heading-level="2">Panel content</calcite-panel>
    </calcite-shell-panel>
    <div id="view">Map goes here</div>
  </calcite-shell>
  <script type="module">
    // Shell does not collapse panels for you on small screens; this does.
    const panel = document.getElementById("ps");
    const narrow = window.matchMedia("(max-width: 600px)");
    const apply = () => { panel.collapsed = narrow.matches; };
    narrow.addEventListener("change", apply);
    apply();
  </script>
</body>
</html>

What our 30 builds do

Of the 30 ATS builds, 23 call matchMedia. The source build for this topic, our Aurora Watch app, checks (max-width: 768px) and moves its inner panel into a dock of its own. Several of our apps move the panel to panel-top on phones; none use panel-bottom, which is the slot Esri suggests for the thumb zone. Both work. If you are starting fresh, Esri’s suggestion is the one with a stated reason. None of our builds use the overlay display mode, the collapse and expand events or updateSize(), and 14 set content-behind on the shell.

5.0 leftovers to clean up

Calcite 5.0 removed two things around the shell, and its release summary says what replaces them:

The modals slot is a different case. It was the slot for the removed calcite-modal, and at 5.x it is no longer in the Shell page or the type declarations. It is also not in the 5.0 list of removed slots, and in our test the 5.0.2 and 5.1.2 shells still rendered content placed in it. Treat it as undocumented and use dialogs.

Then the deprecated properties that still work until their 6.0.0 removal target:

DeprecatedUse insteadATS builds using it
shell-panel widthScale / heightScale (since 3.0)width / height19 use width-scale
shell-panel position, layout (since 5.0)The slot5 use position, each matching its slot
displayMode="float"float-content or float-all5

None of our builds use modals, center-row, calcite-shell-center-row or calcite-modal. In our test, the deprecated position and float logged no console warning, which is why a list like this is worth keeping: a cleanup before 6.0, not a defect today.

Accessibility is on you

Neither the Shell page nor the Shell Panel page has an accessibility section; the Panel page does. Four things we would check in any shell app:

One positive result, from our test only: the shell-panel resize handle was a separator that takes keyboard focus, named “Resize”, and the Right Arrow key widened the panel from 240 px to 250 px. The docs do not describe this, so treat it as observed behavior in 5.1.2, not a documented guarantee.

Cost and licensing

The shell and the shell-panel make no service requests: the API reference lists no property or method that calls a service. That is our reading of the API, not an Esri pricing statement. The licensing page: “Calcite is available with either an ArcGIS Online, ArcGIS Enterprise, or ArcGIS Location Platform account. If you don’t have an account, you can create an ArcGIS Location Platform account for free.” Use is “subject to the terms of use found in the Esri Master Services Agreement.”

The short version

References

Need a Calcite app that works on a phone, too?

The shell gives you the regions; the small-screen behavior, the way back from a collapsed panel and the heading structure are code someone has to write and test. We build and review ArcGIS apps on Calcite, and we can check yours at phone width.

Book a free intro call