Shopify Polaris — Design System
Design system oficial do Shopify para apps embedded. Componentes React acessíveis e consistentes.
Definição
Polaris é o design system do Shopify, usado em todos os apps internos e no admin. Lib React com 80+ componentes (Button, TextField, DataTable, Modal, Page, Card, ResourceList) seguindo padrão visual Shopify. Inclui tokens (cores, espacamento, tipografia), padrões de UX documentados, e regras de acessibilidade WCAG 2.1 AA. Apps embedded (que rodam no admin via iframe) devem usar Polaris para parecer nativos.
Problema → Solução
Problema
App customizado dentro do admin Shopify com visual inconsistente confunde o merchant (parece mockado). Implementar componentes acessíveis do zero é caro. Atualizações de UX do Shopify quebram apps que não seguem o padrão.Solução
Usar Polaris React: instalar `@shopify/polaris`, envolver app com `<AppProvider i18n={...}>`, usar componentes prontos. Tokens via `@shopify/polaris-tokens` para usar em CSS customizado. Quando precisar de algo não previsto, usar primitivos (`<Box>`, `<BlockStack>`, `<InlineStack>`) que respeitam os tokens.Dica de entrevista
Tip
Polaris não é para storefront — é para o admin do merchant. Se você está construindo a loja vista pelo cliente final, use Hydrogen UI ou tema Liquid. Polaris é onde merchants configuram apps, vêem dashboards, gerenciam produtos.Código
// app.tsx — Embedded Shopify app com Polaris + App Bridge
import { AppProvider, Page, Card, Button, TextField, BlockStack } from '@shopify/polaris'
import '@shopify/polaris/build/esm/styles.css'
import enTranslations from '@shopify/polaris/locales/en.json'
import { Provider as AppBridgeProvider } from '@shopify/app-bridge-react'
import { useState } from 'react'
export default function App({ host, apiKey }: { host: string; apiKey: string }) {
return (
<AppBridgeProvider config={{ host, apiKey, forceRedirect: true }}>
<AppProvider i18n={enTranslations}>
<Settings />
</AppProvider>
</AppBridgeProvider>
)
}
function Settings() {
const [name, setName] = useState('')
const [loading, setLoading] = useState(false)
const handleSave = async () => {
setLoading(true)
await fetch('/api/settings', { method: 'POST', body: JSON.stringify({ name }) })
setLoading(false)
}
return (
<Page
title="Configurações"
primaryAction={{ content: 'Salvar', onAction: handleSave, loading }}
backAction={{ content: 'Apps', url: '/' }}
>
<Card>
<BlockStack gap="400">
<TextField
label="Nome da loja"
value={name}
onChange={setName}
autoComplete="off"
helpText="Exibido em emails de confirmação"
/>
<Button onClick={handleSave} loading={loading} variant="primary">
Salvar alterações
</Button>
</BlockStack>
</Card>
</Page>
)
}Perguntas de entrevista
Q.Polaris vs Material UI vs Chakra para app Shopify?▾
A.Polaris é o único que se integra ao visual do admin Shopify nativamente. Se seu app é embedded, USE POLARIS — sem alternativa razoável. Material UI ou Chakra fariam o app parecer "fora do lugar". Se seu app é externo (não embedded), aí qualquer DS serve, mas Polaris ainda é boa escolha para merchants familiarizados.
Q.Como funciona o sistema de tokens do Polaris?▾
A.Tokens são valores semânticos exportados como CSS vars: `--p-color-bg-surface`, `--p-text-heading-md-font-size`, `--p-space-400`. Você usa no CSS customizado e eles seguem o tema (light/dark/contrast) automaticamente. Tokens existem em camadas: primitivos (gray-100) → semânticos (color-bg-fill) → componentes (button-bg).
Q.Como fazer App Bridge + Polaris?▾
A.App Bridge: SDK do Shopify para apps embedded se comunicarem com o admin (navegação, modais, redirects). Polaris: UI dos componentes. Funcionam juntos: App Bridge controla o "chrome" (topbar, navigation) e Polaris os componentes internos. `<AppProvider linkComponent={ShopifyLink}>` substitui `<a>` por navegação client-side do Shopify.
114/122← →