POS style reference

Ask about this Page
Copy for LLM
View as Markdown

Find the theme hooks for each InStore POS surface.

This page connects visible POS surfaces to the theme payload you edit. Use it to identify each surface's theme path, instore-* class hook, MUI component, slot, and common properties.

It also lists behavior and layout toggles, such as the sidebar side and mobile footer.

It composes the rest of the chapter rather than repeating it:

The class and component identifiers below are derived from MUI. Today the themed surfaces are the cart and the shared POS chrome: header, sidebar, search bar, status bars, dialogs, and the camera scanner.

How to target styles

Every visual change lands in one of three layers of the theme payload. Knowing which layer a change belongs to tells you where in the JSON it goes.

  1. Global tokens: palette (colors), typography (text), shape (corner radius), spacing, and zIndex (stacking) at the top level. A token such as 'primary.main' is defined once here and referenced everywhere. Reuse the tokens the theme already defines wherever you can. For more information, see Reference palette tokens.
  2. Per-component styling: under components.MuiX, using a styleOverrides slot or a variants entry. Most InStore surfaces are targeted by a nested class selector inside a slot, such as styleOverrides.<slot> then &.instore-Y (or & .instore-Y for a child), while a few are className variants. The "How to target" column below tells you which.
  3. Behavior and global settings: under customTokens (InStore-specific layout flags), plus components.MuiDrawer.defaultProps.anchor for the sidebar side. To identify the supported layout flags and sidebar setting, see Behavior and global settings.

Every change lands in one of these three layers of the theme payload; the rest of this page shows which layer each surface uses.

Two rules from the Theme API reference govern how a change is saved, and both are reflected in the procedure below:

Use the tokens the theme already defines

The InStore POS theme is a standard MUI theme plus a fixed set of InStore-specific fields. Set and reference only the tokens it already defines:
  • Palette colors: the standard primary, secondary, error, warning, info, and success, plus the InStore-defined tertiary and the background.statusBar surface. You can set their values and add shades you reference, such as primary.dark.
  • Typography: the standard variants (h1 to h6, body1, body2, caption, …) plus the InStore secondary-body variant.
  • Scalars: shape.borderRadius, spacing, breakpoints, and zIndex are plain values you can set directly.

Due to its hosted nature, the InStore POS supports only the theming strategies, fields, and components described in this documentation. Do not add custom theme tokens, components, variants, or other non-standard theming strategies. Non-standard theming is at risk of being overwritten by updates of the InStore POS.

Find the identifier for any element

If a surface is not in the tables below, read its identifier straight from a running POS:

  1. Open the POS in a desktop browser, right-click the element, and choose Inspect.
  2. In the Elements panel, read the element's class list. It tells you the MUI component (.MuiButton-root to MuiButton), the slot (the -root, -paper, -elevation, ... suffix), any state class (Mui-disabled, Mui-selected), and the instore-* hook.
  3. Look the instore-* hook up in the tables below, or target it directly with the layer-2 procedure.
For the longer DevTools walkthrough, see Inspect and override a specific element. It explains how to read state and prop classes and verify that your rule has precedence.

Update a component style step by step

Work through the styling layers in order, applying only the ones you need. The layers are value tokens, component-level styles, and specific element styles. Each step names the exact JSON path so you know where the change goes.

  1. GET the current theme and keep it. It is both your starting point and, because component blocks are replaced atomically, the block you will edit and resend. To review the endpoint response shape, see GET /theme.
  2. Find the element's row in the component reference to get its MUI component, slot, and class.
  3. Layer 1: get or choose the token (the value layer). Reuse a value the theme already defines, or set one under the relevant top-level group: palette for a color, shape.borderRadius for corners, spacing for gaps, zIndex for stacking, typography for text. The example below changes a color, but the same step applies to any token type. This edits palette.*, shape.*, spacing, zIndex.*, or typography.*.
  4. Layer 2: set the component-level (global) style. Put properties that should apply to every instance of that MUI component in components.MuiX.styleOverrides.<slot>. This edits components.MuiX.styleOverrides.<slot>.
  5. Layer 3: set the specific element's style. Target the one surface through its class, either a nested &.instore-Y selector inside the slot or a variants entry with a className matcher. This edits the &.instore-Y block (or components.MuiX.variants[]).
  6. PATCH the full components.MuiX block (atomic replacement), reload the POS, and re-inspect. Prefer token references over hard-coded hex, and remember that numeric radius and spacing are theme multiples. If your rule is struck through in DevTools, it was overridden. To adjust selector specificity and rule order, see Ensure your change has precedence.

Example: recolor the primary action button

The checkout button carries the class instore-primary-action on a MuiButton (a className variant). Make it green as follows.
Layer 1: set the tertiary color token. tertiary is one of the defined palette colors, so you can set and reference it. This is a leaf merge under palette, safe to send on its own:
Layer 1: palette tokenjson
{
  "palette": {
    "tertiary": { "main": "#1B7E3F", "dark": "#176B36", "contrastText": "#ffffff" }
  }
}
Layer 3: reference the token from the variant. This belongs in components.MuiButton.variants[]:
Layer 3: the instore-primary-action variantjson
{
  "props": { "className": "instore-primary-action" },
  "style": {
    "backgroundColor": "tertiary.main",
    "color": "tertiary.contrastText",
    "&:hover": { "backgroundColor": "tertiary.dark" }
  }
}
The bundled variant also defines &:active, &.Mui-disabled, and &.Mui-focusVisible rules. Keep (or re-set) those in your variant so the button looks right in every state. To preserve state-specific styles and troubleshoot overridden rules, see Ensure your change has precedence.
Because components.MuiButton is replaced atomically, send the whole MuiButton block (its defaultProps, the styleOverrides.root rules, and every variants entry), not just the one variant above, or the others are dropped. GET first, edit the block in place, then PATCH it. For the full worked example, see Re-color the primary action button.

Example: restyle the cart line item

The line-item card is instore-line-item-card on MuiPaper, slot elevation, and its inner parts are nested & .instore-line-item-* selectors inside that block. To give the card more padding, a different surface color, and a larger image, edit components.MuiPaper.styleOverrides.elevation:
Layers 2 to 3: the line-item card blockjson
{
  "components": {
    "MuiPaper": {
      "styleOverrides": {
        "elevation": {
          "&.instore-line-item-card": {
            "backgroundColor": "background.paper",
            "borderRadius": "8px",
            "padding": "28px 20px",
            "& .instore-line-item-image": {
              "width": "140px",
              "minWidth": "140px",
              "height": "140px"
            }
          }
        }
      }
    }
  }
}
MuiPaper also styles other cart surfaces (the cart page card, section cards, the totals popover) under the same elevation slot. Include their &.instore-* blocks too when you resend, since the block is atomic.

Ensure your change has precedence

A single element on screen can match more than one style rule at once. For example, it can match a bundled POS theme rule and a rule you add in your override. For each property, the browser applies the value from the rule with precedence and overrides the others. CSS specificity decides which rule has precedence. A more specific selector, such as a class plus a state, takes precedence over a less specific selector. If two rules have the same specificity, the rule defined later has precedence. For the full layering, see How overrides compose.
This matters when theming the InStore POS. The POS ships a complete bundled theme, so most overrides compete with an existing rule. If your rule is less specific than the bundled one, the Theming API still accepts and stores your payload. The POS keeps rendering the original style, so it looks as though nothing changed. Giving your override precedence turns an accepted payload into a visible change. Re-inspect the element in DevTools after reloading. The Styles panel lists the competing rules in priority order and strikes through any value that was overridden.

Two rules can match one element; for each property only the rule with precedence applies. Make your rule more specific, or define it later, so it has precedence.

Why a change can be overridden

Because the bundled POS theme already styles many surfaces across interaction states, on child elements, and with !important, a single-property change can be overridden. Four patterns cause this:
  • Interaction states: a surface is often styled separately for &:hover, &:active, &.Mui-selected, &.Mui-disabled, and &.Mui-focusVisible. Change the base alone and the states keep their old look. Set the ones you care about too.
  • Child elements re-scope a property: a parent often sets a color on its children by selector. For example, the sidebar button sets icon and label color with & .MuiListItemIcon-root and & .MuiListItemText-primary. Those children are also styled on their own components (MuiListItemIcon, MuiListItemText), so a color can live in two places.
  • !important in the bundled theme: a few sizes are pinned with !important (the add-coupon and coupon-scan buttons) so a component sx cannot beat them. To override those, your value must use !important as well.
  • More than one component or variant: the same look can come from several components (input focus borders) or from variants that override the base (the sidebar sub-item and the mobile footer item both re-set the button background).
Use two habits to help a change take precedence. Prefer a variants entry or a class selector over a bare slot rule because it is more specific. Reference tokens so one edit propagates to every rule that uses them.

Surfaces that need extra care for precedence

Surface (class)Why a simple change may be overriddenTo take precedence, also set
Sidebar menu button (MuiListItemButton root)Background is set per state, the icon and label colors are re-scoped on child elements, and two variants override it.&:hover, &.Mui-selected, &.Mui-disabled, &.Mui-focusVisible; icon and label color on MuiListItemIcon and MuiListItemText; the instore-sidebar-subitem and instore-mobile-footer-item variants.
Primary action button (instore-primary-action)The variant carries its own :hover, :active, Mui-disabled, and Mui-focusVisible rules.&:hover, &:active, &.Mui-disabled, &.Mui-focusVisible inside the variant.
Mobile footer item (instore-mobile-footer-item)The selected color and the active indicator live on the selected state.&.Mui-selected color and its ::before indicator.
Input focus and hover ringThe outline color is set on MuiOutlinedInput, MuiInputBase, and MuiFormControl, and the search field hard-codes its own border.Change primary.main, or override those three components; for instore-search-input, edit its own border color.
Active cart tab (instore-cart-tab)The default tab indicator is hidden; the active marker is a top border.&.Mui-selected { borderTopColor }, not MuiTabs-indicator.
Sized dialog buttons (instore-add-coupon-btn, instore-coupon-scan-btn)The size comes from a component sx that outranks the theme.width and height with !important.

Worked example: recolor the sidebar menu button

The sidebar category button (MuiListItemButton) is the clearest case. Its background is set on the base and again for the :hover, Mui-selected, Mui-disabled, and Mui-focusVisible states. Its icon and label colors are set both on the button (& .MuiListItemIcon-root, & .MuiListItemText-primary) and on MuiListItemIcon and MuiListItemText. To recolor it fully and give the override precedence, cover all of these rules in the MuiListItemButton block. Send the whole block because it is atomic:
Recolor the sidebar menu button: every statejson
{
  "components": {
    "MuiListItemButton": {
      "styleOverrides": {
        "root": {
          "backgroundColor": "primary.main",
          "color": "primary.contrastText",
          "& .MuiListItemIcon-root": { "color": "primary.contrastText" },
          "& .MuiListItemText-primary": { "color": "primary.contrastText" },
          "&:hover": { "backgroundColor": "primary.dark" },
          "&.Mui-selected": { "backgroundColor": "primary.dark" },
          "&.Mui-disabled": { "backgroundColor": "action.disabledBackground" }
        }
      }
    }
  }
}
If you also use the sidebar sub-menu or the mobile footer, re-declare the instore-sidebar-subitem and instore-mobile-footer-item variants in the same block. Otherwise, they keep the bundled background.

Component class reference

Each table maps a surface to its class, MUI component, how to target it, and the properties you would typically change. See the How to target column for which selectors to use:
  • styleOverrides.<slot>, &.instore-x: a nested class selector inside a styleOverrides slot (most surfaces).
  • variants (className): a className variant entry.
  • & .instore-x (nested): a child element styled inside its parent's block; edit it there, not as a top-level component.
Rows marked "Layout only" are structural wrappers (flexbox, grid, spacing) you rarely re-brand; they are listed for completeness. Bare color values shown come from the POS starter theme; replace them with palette tokens where you can.
Changing the property in the last column is often not enough on its own. Some surfaces are also styled across interaction states, on child elements, or by a competing variant. Your rule must cover those styles too to take precedence. The surfaces where this matters are called out in Ensure your change has precedence.

App frame

ElementClassMUI componentHow to targetWhat changes
Top header barinstore-header-barMuiAppBarstyleOverrides.root, &.instore-header-barbgcolor, color, boxShadow; nested toolbar and button sizing
Desktop status barinstore-bottom-barMuiAppBarstyleOverrides.root, &.instore-bottom-barbgcolor (status-bar token), color, corner radius
Status bar rowinstore-bottom-bar-rowBox& .instore-bottom-bar-row (nested)Layout only: alignment, spacing
Status bar iteminstore-bottom-bar-itemBox& .instore-bottom-bar-item (nested)fontSize, gap, icon size
Mobile footer barinstore-mobile-bottom-barMuiAppBarstyleOverrides.root, &.instore-mobile-bottom-barbgcolor, color, padding, corner radius
Mobile footer iteminstore-mobile-footer-itemMuiListItemButtonvariants (className)bgcolor, color, selected color, active indicator (::before)
Context menu (header ...)instore-context-menuMuiPaperstyleOverrides.elevation, &.instore-context-menuminWidth, backgroundColor, border, borderRadius
To hide the header, status bar, or mobile footer entirely, use the behavior toggles rather than styling them away.
The sidebar is a MuiDrawer; its sections are nested under styleOverrides.paper. The side it docks on is a behavior setting.
ElementClassMUI componentHow to targetWhat changes
Drawer surfaceNoneMuiDrawerstyleOverrides.paperbgcolor, width (per breakpoint), borderRadius
Sidebar headerinstore-sidebar-headerMuiToolbarMuiDrawer, styleOverrides.paper, & .instore-sidebar-headerbgcolor, color, height
Sidebar bodyinstore-sidebar-bodyBoxMuiDrawer, styleOverrides.paper, & .instore-sidebar-bodyLayout only: scroll area
Sidebar footerinstore-sidebar-footerBoxMuiDrawer, styleOverrides.paper, & .instore-sidebar-footerbgcolor, color
Menu button (category)NoneMuiListItemButtonstyleOverrides.rootbgcolor, color, minHeight, borderRadius, icon and label size. Set every state and child color to take precedence
Submenu iteminstore-sidebar-subitemMuiListItemButtonvariants (className)bgcolor, color, border
Menu list gridinstore-sidebar-main-listMuiListstyleOverrides.rootLayout only: grid columns, gap
Drilldown back buttoninstore-sidebar-drilldown-backMuiButtonMuiDrawer, styleOverrides.paper, & .instore-sidebar-drilldown-backcolor, bgcolor, fontWeight (mobile)
Drilldown submenu listinstore-sidebar-drilldown-listMuiListMuiDrawer, styleOverrides.paper, & .instore-sidebar-drilldown-listLayout only: shown on mobile drilldown
Menu iconNoneMuiListItemIconstyleOverrides.rootcolor, fontSize
Menu labelNoneMuiListItemTextstyleOverrides.primaryfontSize, fontWeight

Search and scan

ElementClassMUI componentHow to targetWhat changes
Search bar containerinstore-search-barMuiStackstyleOverrides.root, &.instore-search-barLayout only: direction, gap
Scan-mode button groupinstore-search-scan-groupMuiButtonGroupstyleOverrides.root, &.instore-search-scan-groupwidth, height, borderRadius
Scan-mode group, selectedinstore-search-scan-group--selectedMuiButtonGroupstyleOverrides.root, &.instore-search-scan-group--selectedbackgroundColor, border (active look)
Scan buttoninstore-search-scan-btnMuiButtonvariants (className)backgroundColor, height, icon color
Search input fieldinstore-search-inputMuiTextFieldstyleOverrides.root, &.instore-search-inputbackgroundColor, input height, border color, fontSize
Search magnifier iconinstore-search-magnifierMuiIconButtonstyleOverrides.root, &.instore-search-magnifiercolor, icon fontSize
Search clear iconinstore-search-clearMuiIconButtonstyleOverrides.root, &.instore-search-clearcolor, icon fontSize
Camera scanner overlayinstore-scanner-overlayMuiStackstyleOverrides.root, &.instore-scanner-overlayLayout only: full-viewport overlay
Scanner instruction textinstore-scanner-textBox& .instore-scanner-text (nested)color, fontSize
Scanner viewfinderinstore-scanner-windowBox& .instore-scanner-window (nested)Bracket --c color, border, width, and height
Scanner action areainstore-scanner-actionsBox& .instore-scanner-actions (nested)Layout only

Cart page and layout

ElementClassMUI componentHow to targetWhat changes
Cart page cardinstore-cart-page-paperMuiPaperstyleOverrides.elevation, &.instore-cart-page-paperbackgroundColor, borderRadius, boxShadow, padding
Cart section cardinstore-cart-section-paperMuiPaperstyleOverrides.elevation, &.instore-cart-section-paperbackgroundColor, border, borderRadius, padding
Items scroll areainstore-cart-items-scrollBox& .instore-cart-items-scroll (nested)Scrollbar width and color
Add-coupon button (float)instore-cart-fabBox& .instore-cart-fab (nested)Layout only: position
Mobile totals blockinstore-cart-mobile-totalsBox& .instore-cart-mobile-totals (nested)Layout only
Sidebar (totals) columninstore-cart-sidebar-colMuiGridstyleOverrides.item, &.instore-cart-sidebar-colLayout only: desktop column width
Content (items) columninstore-cart-content-colMuiGridstyleOverrides.item, &.instore-cart-content-colLayout only: desktop column width
Cart tab stripinstore-cart-tabsMuiTabsstyleOverrides.root, &.instore-cart-tabsminHeight, backgroundColor, indicator
Cart tab (Sale/Return/…)instore-cart-tabMuiTabstyleOverrides.root, &.instore-cart-tabbackgroundColor, borderRadius, color, fontSize, selected marker
Cart tab subtitleinstore-cart-tab-subtitleBox& .instore-cart-tab-subtitle (nested)fontSize, color
Section labelinstore-cart-section-labelMuiTypographystyleOverrides.body1, &.instore-cart-section-labelfontWeight, marginBottom

Cart line item

The card is one MuiPaper, elevation block; most parts are nested selectors inside it. Text, dividers, the quantity field, and the icon buttons are styled on their own components (last rows). A line-item discount is displayed as a text badge below the quantity controls.
ElementClassMUI componentHow to targetWhat changes
Line-item cardinstore-line-item-cardMuiPaperstyleOverrides.elevation, &.instore-line-item-cardbackgroundColor, borderRadius, padding, gap
Product imageinstore-line-item-imageBox& .instore-line-item-image (nested)width, height, backgroundSize, borderRadius
Body columninstore-line-item-bodyBox& .instore-line-item-body (nested)Layout only
Top row (name + menu)instore-line-item-row-topBox& .instore-line-item-row-top (nested)Layout only
Product nameinstore-line-item-nameMuiTypographystyleOverrides.h6, &.instore-line-item-namefontSize, fontWeight, color
Actions (kebab) buttoninstore-line-item-actions-btnMuiIconButton& .instore-line-item-actions-btn (nested)Layout only: position
Meta row (SKU, price)instore-line-item-meta-rowBox& .instore-line-item-meta-row (nested)Layout only
Meta labelinstore-line-item-meta-labelMuiTypographystyleOverrides.caption, &.instore-line-item-meta-labelfontSize, color (secondary)
Meta valueinstore-line-item-meta-valueMuiTypographystyleOverrides.body2, &.instore-line-item-meta-valuefontSize, color
Meta dividerinstore-line-item-meta-dividerMuiDivider& .instore-line-item-meta-divider (nested)height, borderColor
Quantity rowinstore-line-item-qty-rowBox& .instore-line-item-qty-row (nested)Layout only
Quantity inputinstore-line-item-qty-inputMuiTextFieldstyleOverrides.root, &.instore-line-item-qty-inputwidth, height, backgroundColor, borderRadius
Quantity +/- buttoninstore-line-item-qty-btnMuiIconButtonstyleOverrides.root, &.instore-line-item-qty-btnwidth, height, color
Extended price blockinstore-line-item-extended-price-blockBox& .instore-line-item-extended-price-block (nested)Layout only
Extended price labelinstore-line-item-extended-price-labelMuiTypographystyleOverrides.caption, &.instore-line-item-extended-price-labelfontSize, color
Extended price valueinstore-line-item-extended-priceMuiTypographystyleOverrides.h6, &.instore-line-item-extended-pricefontSize, color
Attribute rowinstore-line-item-attr-rowBox& .instore-line-item-attr-row (nested)Layout only
Attribute iteminstore-line-item-attr-itemBox& .instore-line-item-attr-item (nested)Layout only
Attribute dividerinstore-line-item-attr-dividerMuiDividerstyleOverrides.root, &.instore-line-item-attr-dividerheight, borderColor
Discount text badgeinstore-line-item-discount-labelMuiTypographystyleOverrides.body2, &.instore-line-item-discount-labelbackgroundColor, color, borderRadius, padding
Struck-through priceinstore-line-item-price-strikethroughMuiTypographystyleOverrides.body2, &.instore-line-item-price-strikethroughtextDecoration, color
Discount rowinstore-line-item-discount-rowBox& .instore-line-item-discount-row (nested)Layout only
Remove (delete) buttoninstore-line-item-remove-btnMuiIconButtonstyleOverrides.root, &.instore-line-item-remove-btnbackgroundColor, border, color

Cart totals (money box)

ElementClassMUI componentHow to targetWhat changes
Totals listinstore-totals-listMuiListstyleOverrides.root, &.instore-totals-listLayout only: switches the list to block flow
Totals rowinstore-totals-list-itemMuiListItemstyleOverrides.root, &.instore-totals-list-itemSpacing, alignment
Totals row, flushinstore-totals-list-item-flushMuiListItem&.instore-totals-list-item-flush (modifier)Right padding
Totals labelinstore-totals-headerMuiTypographystyleOverrides.h6, &.instore-totals-headerfontSize, fontWeight
Totals amountinstore-totals-header-amountMuiTypographystyleOverrides.h6, &.instore-totals-header-amountfontSize, fontWeight
Emphasis modifierinstore-totals-emphasizedMuiTypographycombined with a totals class (modifier)fontWeight, fontSize (bold totals)
Net-due modifierinstore-totals-net-dueMuiTypographycombined with a totals class (modifier)fontSize (large net-due amount)
Totals note textinstore-totals-textMuiTypographystyleOverrides.h6, &.instore-totals-textfontSize, fontStyle
Totals note amountinstore-totals-amountMuiTypographystyleOverrides.h6, &.instore-totals-amountfontSize, fontStyle
Single dividerinstore-totals-divider-t1MuiDividerstyleOverrides.root, &.instore-totals-divider-t1margin, borderColor
Spacer dividerinstore-totals-divider-t2MuiDividerstyleOverrides.root, &.instore-totals-divider-t2borderBottomWidth, margin
Coupon chipinstore-cart-coupon-chipMuiChipstyleOverrides.root, &.instore-cart-coupon-chipheight, backgroundColor, border, label padding
Totals popover surfaceinstore-totals-popper-contentMuiPaperstyleOverrides.elevation, &.instore-totals-popper-contentbackgroundColor, border, borderRadius
Totals toggle (mobile)instore-cart-totals-toggleMuiIconButtonstyleOverrides.root, &.instore-cart-totals-toggleboxShadow
A cart-level discount in the totals area is displayed as a discount row created with a MuiListItem that has several nested parts:
ElementClassMUI componentHow to targetWhat changes
Discount rowinstore-cart-discount-rowMuiListItemstyleOverrides.root, &.instore-cart-discount-rowbackgroundColor, border, borderRadius, color
Discount icon boxinstore-cart-discount-icon-boxBox& .instore-cart-discount-icon-box (nested)backgroundColor, size
Discount iconinstore-cart-discount-iconMuiSvgIcon& .instore-cart-discount-icon (nested)color, fontSize
Discount nameinstore-cart-discount-nameBox& .instore-cart-discount-name (nested)fontSize, fontWeight, color
Discount descriptioninstore-cart-discount-descBox& .instore-cart-discount-desc (nested)fontSize, color
"Applied" statusinstore-cart-discount-appliedBox& .instore-cart-discount-applied (nested)color
Discount amountinstore-cart-discount-amountBox& .instore-cart-discount-amount (nested)color

Dialogs

ElementClassMUI componentHow to targetWhat changes
Add-coupon dialoginstore-add-coupon-dialogMuiDialogstyleOverrides.root, &.instore-add-coupon-dialogDialog width, border, borderRadius; backdrop color (nested)
Dialog titleinstore-add-coupon-titleMuiTypographystyleOverrides.body1, &.instore-add-coupon-titlefontSize, color
Input rowinstore-add-coupon-rowMuiStackstyleOverrides.root, &.instore-add-coupon-rowLayout only
Coupon code inputinstore-add-coupon-inputMuiTextFieldstyleOverrides.root, &.instore-add-coupon-inputInput height
Coupon scan buttoninstore-coupon-scan-btnMuiIconButtonstyleOverrides.root, &.instore-coupon-scan-btnbackgroundColor, size
Action rowinstore-add-coupon-actionsMuiStackstyleOverrides.root, &.instore-add-coupon-actionsLayout only
Apply or cancel buttoninstore-add-coupon-btnMuiButtonstyleOverrides.root, &.instore-add-coupon-btnwidth, height

Global component overrides (no class hook)

These components are styled globally. They have no instore-* hook, so a change applies to every instance. Edit the slot shown to retune them across the POS.
ElementMUI componentHow to targetWhat changes
Page background and bodyMuiCssBaselinestyleOverrides.bodybgcolor (background.default), color, scrollbar
Input focus and hover ringMuiOutlinedInput, MuiInputBase, MuiFormControlstyleOverrides.rootOutline borderColor (primary.main) on focus/hover
Field labelMuiFormLabelstyleOverrides.rootcolor, focused color
Radio or checkboxMuiRadio, MuiCheckboxstyleOverrides.rootcolor (primary.main)
Menu surfaceMuiMenustyleOverrides.paperText color, Mui-disabled item color
Dialog surface (default)MuiDialogstyleOverrides.paperbackgroundColor (background.default)
Modal backdropMuiBackdropstyleOverrides.rootScrim backgroundColor

Behavior and global settings

Behavior and layout (what shows, and which side the sidebar sits on) are controlled outside the visual styling layers. Most are InStore-specific customTokens; the sidebar side is a MuiDrawer default prop. Each accepts the value types linked in the table.
SettingTheme pathValuesPOS starter default
Sidebar sidecomponents.MuiDrawer.defaultProps.anchor"left" or "right" (atomic block)"right"
Show the header barcustomTokens.layout.headerVisibleboolean or responsive maptrue
Show the mobile footer menucustomTokens.layout.mobileFooterboolean or responsive map{ "xs": true, "md": false }
Show the desktop status barcustomTokens.layout.desktopFooterboolean or responsive map{ "xs": false, "md": true }
Show the sidebar logocustomTokens.sidebar.showLogoboolean or responsive mapfalse
Show the sidebar collapse buttoncustomTokens.sidebar.showCollapseButtonboolean or responsive map{ "xs": true, "md": false }
A responsive map ({ "xs": …, "md": … }) lets a setting differ per breakpoint, for example showing the footer on phones but not on terminals. A bare boolean applies at every size. When a layout flag is false, the component is not rendered (it is removed, not hidden with CSS).

Example: move the sidebar to the left

The sidebar side comes from components.MuiDrawer.defaultProps.anchor. The POS starter docks it on the right; set it to "left" and the surrounding layout flips to match:
PATCH: sidebar on the left (full block abbreviated)json
{
  "components": {
    "MuiDrawer": {
      "defaultProps": { "anchor": "left", "variant": "permanent" },
      "variants": [],
      "styleOverrides": { "paper": {} }
    }
  }
}
components.MuiDrawer is replaced atomically. Sending only defaultProps (as the abbreviated example shows the shape) would drop the bundled sidebar styleOverrides and variants and break its appearance. GET the theme, change defaultProps.anchor inside the returned MuiDrawer block, and PATCH the whole block back. To review the full sidebar update example, see PATCH /theme: move the sidebar.