R
Interview Deckreact · next.js · senior/staff
0·0·122
System Design

Shopify Polaris — Design System

Design system oficial do Shopify para apps embedded. Componentes React acessíveis e consistentes.

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
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.
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.
// 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>
  )
}
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← →