---
name: vtex-io-admin-react
description: "Apply when building VTEX IO admin-facing React interfaces under the admin builder. Covers VTEX Styleguide and Shoreline usage, admin page composition, data-heavy admin interactions, and keeping administrative interfaces consistent with the VTEX Admin environment. Use for settings pages, moderation tools, dashboards, or operational UIs inside VTEX Admin."
---
# Admin React Interfaces
## When this skill applies
Use this skill when building administrative React interfaces for VTEX Admin experiences.
- Settings pages
- Moderation tools
- Internal dashboards
- Operational forms and tables
Do not use this skill for:
- storefront components
- render-runtime blocks
- route authorization design
- backend service structure
## Decision rules
- Use VTEX official design systems for admin interfaces.
- Prefer `vtex.styleguide` as the default choice for VTEX IO admin apps published to customers.
- Accept `@vtex/shoreline` as an official VTEX design system, especially in internal back-office contexts.
- Prefer core Styleguide layout patterns such as `Layout`, `PageHeader`, and `PageBlock` for page composition.
- Prefer Styleguide building blocks for common admin needs: `Table`, `Input`, `Dropdown`, `Toggle`, `Tabs`, `Modal`, `Spinner`, and `Alert`.
- Keep admin screens focused on operational clarity rather than storefront styling concerns.
- Prefer explicit loading, empty, and error states for data-heavy admin pages.
- Use button loading states and toast-based feedback for async actions so users can tell when a mutation starts, succeeds, or fails.
- Prefer internationalized messages over hardcoded admin copy so labels and feedback can stay consistent across stores and locales.
- Use tables, forms, filters, and feedback patterns that align with VTEX Admin conventions.
- Prefer official design system components over custom clickable `div` or `span` patterns so focus behavior, keyboard navigation, and accessibility attributes remain correct by default.
- For large lists and tables, prefer pagination and server-side filtering over loading everything into the browser and filtering in memory.
- For search and filtering, prefer the search and filter patterns offered by the official design systems instead of inventing custom control behavior.
- Keep labels, messages, and action copy in a single language per app and avoid mixing tones or languages on the same screen.
- In forms, keep actions consistent: use a primary save action, an optional secondary cancel action when appropriate, and explicit feedback after submit.
## Hard constraints
### Constraint: Admin UIs must use VTEX design systems
Admin panel components MUST use VTEX official design systems.
**Why this matters**
VTEX Admin has a consistent design language. VTEX official design systems preserve that consistency, while generic third-party UI libraries create inconsistent visuals, styling conflicts, and review problems.
**Detection**
If you see Material UI, Chakra, Ant Design, or another generic third-party UI system in an admin app, STOP and replace it with VTEX design system patterns. Do not flag `@vtex/shoreline` as third-party.
**Correct**
```tsx
import { Layout, PageHeader, PageBlock, Table } from 'vtex.styleguide'
```
```tsx
import { Button, Table, EmptyState } from '@vtex/shoreline'
```
**Wrong**
```tsx
import { DataGrid } from '@material-ui/data-grid'
```
### Constraint: Admin screens must expose loading, empty, and error states
Operational interfaces MUST make data state visible to the user.
**Why this matters**
Admin users need reliable operational feedback. Silent blank screens are harder to support and diagnose than explicit states.
**Detection**
If a page loads remote data but renders nothing meaningful on loading, empty, or error cases, STOP and add explicit UI states.
**Correct**
```tsx
if (loading) {
return (
)
}
if (error) {
return (
Failed to load data. Please try again.
)
}
```
**Wrong**
```tsx
return
```
### Constraint: Admin actions must provide explicit user feedback
Mutations in admin screens MUST report success, failure, or pending state clearly.
**Why this matters**
Operational actions affect real store configuration and data. Users need immediate feedback to avoid repeated or ambiguous actions.
**Detection**
If a button triggers a write action with no feedback on result, STOP and add explicit feedback.
**Correct**
```tsx
showToast({ message: 'Settings saved successfully' })
```
**Wrong**
```tsx
```
### Constraint: Data-heavy admin screens must stay bounded and navigable
Lists, tables, and search-heavy admin screens MUST use bounded rendering patterns such as pagination and should prefer server-side filtering when the API supports it.
**Why this matters**
Admin pages often deal with operational datasets that grow over time. Rendering too many rows at once or filtering only in memory creates poor performance and brittle UX.
**Detection**
If a page renders very large collections without pagination, or loads the full dataset into the browser just to filter locally, STOP and add bounded navigation or server-side filtering.
**Correct**
```tsx
```
### Constraint: Interactive controls must use accessible semantics
Admin interactions MUST use accessible controls and should prefer official design system components instead of custom clickable non-semantic elements.
**Why this matters**
Keyboard navigation, focus handling, and screen-reader behavior are part of baseline admin usability. Non-semantic clickable elements make accessibility regressions much more likely.
**Detection**
If you see clickable `div` or `span` elements being used as primary controls where a button, link, or design system component should be used, STOP and replace them.
**Correct**
```tsx
```
**Wrong**
```tsx
Save
```
## Admin builder structure
Admin pages in VTEX IO are exposed through the Admin builder:
- Use the `admin/` folder to declare navigation and routes.
- Use `admin/navigation.json` to define sections, subsections, and Admin navigation paths.
- Use `admin/routes.json` to map each Admin path to a React component implemented under `react/`.
- Use the `react/` folder to implement the page components used by Admin routes.
Practical rules:
- Each entry in `admin/routes.json` should point to a real component in `react/`.
- The route `path` should stay aligned with the navigation structure declared in `admin/navigation.json`.
- Page components should use VTEX Admin layout patterns such as `Layout`, `PageHeader`, and `PageBlock`, or official Shoreline equivalents in internal contexts.
### Example: navigation.json structure
`admin/navigation.json`:
```json
[
{
"section": "storeSettings",
"subSection": "storeFront",
"subSectionItems": [
{
"labelId": "admin/my-settings.navigation.title",
"path": "/admin/app/my-settings"
}
]
}
]
```
Main fields:
- `section` / `subSection`: define where the link appears in the Admin navigation tree.
- `subSectionItems[].path`: should match the `path` declared in `admin/routes.json`.
- `titleId` / `labelId`: message IDs used to internationalize navigation labels.
- `adminVersion`: optional and only needed for compatibility between legacy and newer Admin experiences. Do not use it in the default example for new apps.
### Example: tying Admin builder to a React page
`admin/routes.json`:
```json
{
"admin.app.my-settings": {
"component": "MySettingsPage",
"path": "/admin/app/my-settings"
}
}
```
`react/MySettingsPage.tsx`:
```tsx
import React from 'react'
import { Layout, PageHeader, PageBlock } from 'vtex.styleguide'
const MySettingsPage: React.FC = () => (
}>
{/* Page content goes here */}
)
export default MySettingsPage
```
## Preferred pattern
Use VTEX design systems to keep operational state explicit and optimize for clarity over ornamental UI.
Use `PageHeader` and `PageBlock` with Styleguide where appropriate, or equivalent official Shoreline patterns in internal contexts. Use `Spinner`/`Alert`/`EmptyState` for data states and `showToast` plus button loading states for async feedback.
Use paginated tables for large datasets, prefer server-side filtering when possible, and keep form actions consistent with primary save and optional cancel behavior.
## Common failure modes
- Using third-party UI libraries in admin apps.
- Omitting loading, empty, or error states.
- Triggering mutations without visible feedback.
- Rendering large tables without pagination or filtering everything only in memory.
- Building clickable controls with non-semantic elements instead of accessible buttons or links.
- Mixing languages or inconsistent copy style on the same admin screen.
## Review checklist
- [ ] Does the screen use VTEX official design systems (Styleguide or Shoreline), not generic UI libs?
- [ ] Does the page use `PageHeader` and `PageBlock` layout patterns where appropriate (or Shoreline equivalents)?
- [ ] Are loading, empty, and error states explicit?
- [ ] Are large tables or lists paginated and filtered in a scalable way?
- [ ] Are write actions safe and visible?
- [ ] Are interactive controls using accessible semantics instead of clickable non-semantic elements?
- [ ] Are labels and feedback messages internationalized instead of hardcoded?
- [ ] Is the app using one consistent language and tone for labels and actions?
- [ ] Does the UI look and behave like a VTEX Admin tool?
## Reference
- [Admin apps](https://developers.vtex.com/docs/guides/vtex-io-documentation-admin-builder) - Admin builder context
- [Shoreline repository](https://github.com/vtex/shoreline) - Official VTEX Shoreline design system repository
- [Shoreline docs](https://admin-ui.vercel.app/) - Shoreline component and design system documentation