Find the theme hooks for each InStore POS surface.
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:
- Run InStore POS API requests: authenticate and run the calls.
- Theme API reference: the
GET,PUT, andPATCHendpoints and validation rules. - Customize POS styles and behavior: the authoring guide these tables draw on.
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.
- Global tokens:
palette(colors),typography(text),shape(corner radius),spacing, andzIndex(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. - Per-component styling: under
components.MuiX, using astyleOverridesslot or avariantsentry. Most InStore surfaces are targeted by a nested class selector inside a slot, such asstyleOverrides.<slot>then&.instore-Y(or& .instore-Yfor a child), while a few are classNamevariants. The "How to target" column below tells you which. - Behavior and global settings: under
customTokens(InStore-specific layout flags), pluscomponents.MuiDrawer.defaultProps.anchorfor 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.
- Component values resolve as MUI
sx, so a numericborderRadiusor spacing is a theme multiple, not pixels. Use a string such as"8px"for an exact value. To understand how component override values resolve and which palette token strings are supported, see the note in the authoring guide. - A
components.MuiXblock is replaced atomically (leaf merge versus atomic replacement).GETthe current block, edit it, and send the whole block back. Values undercustomTokensandpalette, by contrast, deep-merge at the leaf.
Use the tokens the theme already defines
- Palette colors: the standard
primary,secondary,error,warning,info, andsuccess, plus the InStore-definedtertiaryand thebackground.statusBarsurface. You can set their values and add shades you reference, such asprimary.dark. - Typography: the standard variants (
h1toh6,body1,body2,caption, …) plus the InStore secondary-body variant. - Scalars:
shape.borderRadius,spacing,breakpoints, andzIndexare 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:
- Open the POS in a desktop browser, right-click the element, and choose Inspect.
- In the Elements panel, read the element's class list. It tells you the MUI component (
.MuiButton-roottoMuiButton), the slot (the-root,-paper,-elevation, ... suffix), any state class (Mui-disabled,Mui-selected), and theinstore-*hook. - Look the
instore-*hook up in the tables below, or target it directly with the layer-2 procedure.
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.
GETthe 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, seeGET /theme.- Find the element's row in the component reference to get its MUI component, slot, and class.
- 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:
palettefor a color,shape.borderRadiusfor corners,spacingfor gaps,zIndexfor stacking,typographyfor text. The example below changes a color, but the same step applies to any token type. This editspalette.*,shape.*,spacing,zIndex.*, ortypography.*. - 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 editscomponents.MuiX.styleOverrides.<slot>. - Layer 3: set the specific element's style. Target the one surface through its class, either a nested
&.instore-Yselector inside the slot or avariantsentry with aclassNamematcher. This edits the&.instore-Yblock (orcomponents.MuiX.variants[]). PATCHthe fullcomponents.MuiXblock (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: restyle the cart line item
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:{
"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
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
!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-rootand& .MuiListItemText-primary. Those children are also styled on their own components (MuiListItemIcon,MuiListItemText), so a color can live in two places. !importantin the bundled theme: a few sizes are pinned with!important(the add-coupon and coupon-scan buttons) so a componentsxcannot beat them. To override those, your value must use!importantas well.- More than one component or variant: the same look can come from several components (input focus borders) or from
variantsthat override the base (the sidebar sub-item and the mobile footer item both re-set the button background).
Surfaces that need extra care for precedence
| Surface (class) | Why a simple change may be overridden | To 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 ring | The 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. |
Component class reference
styleOverrides.<slot>,&.instore-x: a nested class selector inside astyleOverridesslot (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.
App frame
| Element | Class | MUI component | How to target | What changes |
|---|---|---|---|---|
| Top header bar | instore-header-bar | MuiAppBar | styleOverrides.root, &.instore-header-bar | bgcolor, color, boxShadow; nested toolbar and button sizing |
| Desktop status bar | instore-bottom-bar | MuiAppBar | styleOverrides.root, &.instore-bottom-bar | bgcolor (status-bar token), color, corner radius |
| Status bar row | instore-bottom-bar-row | Box | & .instore-bottom-bar-row (nested) | Layout only: alignment, spacing |
| Status bar item | instore-bottom-bar-item | Box | & .instore-bottom-bar-item (nested) | fontSize, gap, icon size |
| Mobile footer bar | instore-mobile-bottom-bar | MuiAppBar | styleOverrides.root, &.instore-mobile-bottom-bar | bgcolor, color, padding, corner radius |
| Mobile footer item | instore-mobile-footer-item | MuiListItemButton | variants (className) | bgcolor, color, selected color, active indicator (::before) |
| Context menu (header ...) | instore-context-menu | MuiPaper | styleOverrides.elevation, &.instore-context-menu | minWidth, backgroundColor, border, borderRadius |
Search and scan
| Element | Class | MUI component | How to target | What changes |
|---|---|---|---|---|
| Search bar container | instore-search-bar | MuiStack | styleOverrides.root, &.instore-search-bar | Layout only: direction, gap |
| Scan-mode button group | instore-search-scan-group | MuiButtonGroup | styleOverrides.root, &.instore-search-scan-group | width, height, borderRadius |
| Scan-mode group, selected | instore-search-scan-group--selected | MuiButtonGroup | styleOverrides.root, &.instore-search-scan-group--selected | backgroundColor, border (active look) |
| Scan button | instore-search-scan-btn | MuiButton | variants (className) | backgroundColor, height, icon color |
| Search input field | instore-search-input | MuiTextField | styleOverrides.root, &.instore-search-input | backgroundColor, input height, border color, fontSize |
| Search magnifier icon | instore-search-magnifier | MuiIconButton | styleOverrides.root, &.instore-search-magnifier | color, icon fontSize |
| Search clear icon | instore-search-clear | MuiIconButton | styleOverrides.root, &.instore-search-clear | color, icon fontSize |
| Camera scanner overlay | instore-scanner-overlay | MuiStack | styleOverrides.root, &.instore-scanner-overlay | Layout only: full-viewport overlay |
| Scanner instruction text | instore-scanner-text | Box | & .instore-scanner-text (nested) | color, fontSize |
| Scanner viewfinder | instore-scanner-window | Box | & .instore-scanner-window (nested) | Bracket --c color, border, width, and height |
| Scanner action area | instore-scanner-actions | Box | & .instore-scanner-actions (nested) | Layout only |
Cart page and layout
| Element | Class | MUI component | How to target | What changes |
|---|---|---|---|---|
| Cart page card | instore-cart-page-paper | MuiPaper | styleOverrides.elevation, &.instore-cart-page-paper | backgroundColor, borderRadius, boxShadow, padding |
| Cart section card | instore-cart-section-paper | MuiPaper | styleOverrides.elevation, &.instore-cart-section-paper | backgroundColor, border, borderRadius, padding |
| Items scroll area | instore-cart-items-scroll | Box | & .instore-cart-items-scroll (nested) | Scrollbar width and color |
| Add-coupon button (float) | instore-cart-fab | Box | & .instore-cart-fab (nested) | Layout only: position |
| Mobile totals block | instore-cart-mobile-totals | Box | & .instore-cart-mobile-totals (nested) | Layout only |
| Sidebar (totals) column | instore-cart-sidebar-col | MuiGrid | styleOverrides.item, &.instore-cart-sidebar-col | Layout only: desktop column width |
| Content (items) column | instore-cart-content-col | MuiGrid | styleOverrides.item, &.instore-cart-content-col | Layout only: desktop column width |
| Cart tab strip | instore-cart-tabs | MuiTabs | styleOverrides.root, &.instore-cart-tabs | minHeight, backgroundColor, indicator |
| Cart tab (Sale/Return/…) | instore-cart-tab | MuiTab | styleOverrides.root, &.instore-cart-tab | backgroundColor, borderRadius, color, fontSize, selected marker |
| Cart tab subtitle | instore-cart-tab-subtitle | Box | & .instore-cart-tab-subtitle (nested) | fontSize, color |
| Section label | instore-cart-section-label | MuiTypography | styleOverrides.body1, &.instore-cart-section-label | fontWeight, marginBottom |
Cart line item
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.| Element | Class | MUI component | How to target | What changes |
|---|---|---|---|---|
| Line-item card | instore-line-item-card | MuiPaper | styleOverrides.elevation, &.instore-line-item-card | backgroundColor, borderRadius, padding, gap |
| Product image | instore-line-item-image | Box | & .instore-line-item-image (nested) | width, height, backgroundSize, borderRadius |
| Body column | instore-line-item-body | Box | & .instore-line-item-body (nested) | Layout only |
| Top row (name + menu) | instore-line-item-row-top | Box | & .instore-line-item-row-top (nested) | Layout only |
| Product name | instore-line-item-name | MuiTypography | styleOverrides.h6, &.instore-line-item-name | fontSize, fontWeight, color |
| Actions (kebab) button | instore-line-item-actions-btn | MuiIconButton | & .instore-line-item-actions-btn (nested) | Layout only: position |
| Meta row (SKU, price) | instore-line-item-meta-row | Box | & .instore-line-item-meta-row (nested) | Layout only |
| Meta label | instore-line-item-meta-label | MuiTypography | styleOverrides.caption, &.instore-line-item-meta-label | fontSize, color (secondary) |
| Meta value | instore-line-item-meta-value | MuiTypography | styleOverrides.body2, &.instore-line-item-meta-value | fontSize, color |
| Meta divider | instore-line-item-meta-divider | MuiDivider | & .instore-line-item-meta-divider (nested) | height, borderColor |
| Quantity row | instore-line-item-qty-row | Box | & .instore-line-item-qty-row (nested) | Layout only |
| Quantity input | instore-line-item-qty-input | MuiTextField | styleOverrides.root, &.instore-line-item-qty-input | width, height, backgroundColor, borderRadius |
| Quantity +/- button | instore-line-item-qty-btn | MuiIconButton | styleOverrides.root, &.instore-line-item-qty-btn | width, height, color |
| Extended price block | instore-line-item-extended-price-block | Box | & .instore-line-item-extended-price-block (nested) | Layout only |
| Extended price label | instore-line-item-extended-price-label | MuiTypography | styleOverrides.caption, &.instore-line-item-extended-price-label | fontSize, color |
| Extended price value | instore-line-item-extended-price | MuiTypography | styleOverrides.h6, &.instore-line-item-extended-price | fontSize, color |
| Attribute row | instore-line-item-attr-row | Box | & .instore-line-item-attr-row (nested) | Layout only |
| Attribute item | instore-line-item-attr-item | Box | & .instore-line-item-attr-item (nested) | Layout only |
| Attribute divider | instore-line-item-attr-divider | MuiDivider | styleOverrides.root, &.instore-line-item-attr-divider | height, borderColor |
| Discount text badge | instore-line-item-discount-label | MuiTypography | styleOverrides.body2, &.instore-line-item-discount-label | backgroundColor, color, borderRadius, padding |
| Struck-through price | instore-line-item-price-strikethrough | MuiTypography | styleOverrides.body2, &.instore-line-item-price-strikethrough | textDecoration, color |
| Discount row | instore-line-item-discount-row | Box | & .instore-line-item-discount-row (nested) | Layout only |
| Remove (delete) button | instore-line-item-remove-btn | MuiIconButton | styleOverrides.root, &.instore-line-item-remove-btn | backgroundColor, border, color |
Cart totals (money box)
| Element | Class | MUI component | How to target | What changes |
|---|---|---|---|---|
| Totals list | instore-totals-list | MuiList | styleOverrides.root, &.instore-totals-list | Layout only: switches the list to block flow |
| Totals row | instore-totals-list-item | MuiListItem | styleOverrides.root, &.instore-totals-list-item | Spacing, alignment |
| Totals row, flush | instore-totals-list-item-flush | MuiListItem | &.instore-totals-list-item-flush (modifier) | Right padding |
| Totals label | instore-totals-header | MuiTypography | styleOverrides.h6, &.instore-totals-header | fontSize, fontWeight |
| Totals amount | instore-totals-header-amount | MuiTypography | styleOverrides.h6, &.instore-totals-header-amount | fontSize, fontWeight |
| Emphasis modifier | instore-totals-emphasized | MuiTypography | combined with a totals class (modifier) | fontWeight, fontSize (bold totals) |
| Net-due modifier | instore-totals-net-due | MuiTypography | combined with a totals class (modifier) | fontSize (large net-due amount) |
| Totals note text | instore-totals-text | MuiTypography | styleOverrides.h6, &.instore-totals-text | fontSize, fontStyle |
| Totals note amount | instore-totals-amount | MuiTypography | styleOverrides.h6, &.instore-totals-amount | fontSize, fontStyle |
| Single divider | instore-totals-divider-t1 | MuiDivider | styleOverrides.root, &.instore-totals-divider-t1 | margin, borderColor |
| Spacer divider | instore-totals-divider-t2 | MuiDivider | styleOverrides.root, &.instore-totals-divider-t2 | borderBottomWidth, margin |
| Coupon chip | instore-cart-coupon-chip | MuiChip | styleOverrides.root, &.instore-cart-coupon-chip | height, backgroundColor, border, label padding |
| Totals popover surface | instore-totals-popper-content | MuiPaper | styleOverrides.elevation, &.instore-totals-popper-content | backgroundColor, border, borderRadius |
| Totals toggle (mobile) | instore-cart-totals-toggle | MuiIconButton | styleOverrides.root, &.instore-cart-totals-toggle | boxShadow |
MuiListItem that has several nested parts:| Element | Class | MUI component | How to target | What changes |
|---|---|---|---|---|
| Discount row | instore-cart-discount-row | MuiListItem | styleOverrides.root, &.instore-cart-discount-row | backgroundColor, border, borderRadius, color |
| Discount icon box | instore-cart-discount-icon-box | Box | & .instore-cart-discount-icon-box (nested) | backgroundColor, size |
| Discount icon | instore-cart-discount-icon | MuiSvgIcon | & .instore-cart-discount-icon (nested) | color, fontSize |
| Discount name | instore-cart-discount-name | Box | & .instore-cart-discount-name (nested) | fontSize, fontWeight, color |
| Discount description | instore-cart-discount-desc | Box | & .instore-cart-discount-desc (nested) | fontSize, color |
| "Applied" status | instore-cart-discount-applied | Box | & .instore-cart-discount-applied (nested) | color |
| Discount amount | instore-cart-discount-amount | Box | & .instore-cart-discount-amount (nested) | color |
Dialogs
| Element | Class | MUI component | How to target | What changes |
|---|---|---|---|---|
| Add-coupon dialog | instore-add-coupon-dialog | MuiDialog | styleOverrides.root, &.instore-add-coupon-dialog | Dialog width, border, borderRadius; backdrop color (nested) |
| Dialog title | instore-add-coupon-title | MuiTypography | styleOverrides.body1, &.instore-add-coupon-title | fontSize, color |
| Input row | instore-add-coupon-row | MuiStack | styleOverrides.root, &.instore-add-coupon-row | Layout only |
| Coupon code input | instore-add-coupon-input | MuiTextField | styleOverrides.root, &.instore-add-coupon-input | Input height |
| Coupon scan button | instore-coupon-scan-btn | MuiIconButton | styleOverrides.root, &.instore-coupon-scan-btn | backgroundColor, size |
| Action row | instore-add-coupon-actions | MuiStack | styleOverrides.root, &.instore-add-coupon-actions | Layout only |
| Apply or cancel button | instore-add-coupon-btn | MuiButton | styleOverrides.root, &.instore-add-coupon-btn | width, height |
Global component overrides (no class hook)
instore-* hook, so a change applies to every instance. Edit the slot shown to retune them across the POS.| Element | MUI component | How to target | What changes |
|---|---|---|---|
| Page background and body | MuiCssBaseline | styleOverrides.body | bgcolor (background.default), color, scrollbar |
| Input focus and hover ring | MuiOutlinedInput, MuiInputBase, MuiFormControl | styleOverrides.root | Outline borderColor (primary.main) on focus/hover |
| Field label | MuiFormLabel | styleOverrides.root | color, focused color |
| Radio or checkbox | MuiRadio, MuiCheckbox | styleOverrides.root | color (primary.main) |
| Menu surface | MuiMenu | styleOverrides.paper | Text color, Mui-disabled item color |
| Dialog surface (default) | MuiDialog | styleOverrides.paper | backgroundColor (background.default) |
| Modal backdrop | MuiBackdrop | styleOverrides.root | Scrim backgroundColor |
Behavior and global settings
customTokens; the sidebar side is a MuiDrawer default prop. Each accepts the value types linked in the table.| Setting | Theme path | Values | POS starter default |
|---|---|---|---|
| Sidebar side | components.MuiDrawer.defaultProps.anchor | "left" or "right" (atomic block) | "right" |
| Show the header bar | customTokens.layout.headerVisible | boolean or responsive map | true |
| Show the mobile footer menu | customTokens.layout.mobileFooter | boolean or responsive map | { "xs": true, "md": false } |
| Show the desktop status bar | customTokens.layout.desktopFooter | boolean or responsive map | { "xs": false, "md": true } |
| Show the sidebar logo | customTokens.sidebar.showLogo | boolean or responsive map | false |
| Show the sidebar collapse button | customTokens.sidebar.showCollapseButton | boolean or responsive map | { "xs": true, "md": false } |
{ "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).