# Sistema de design Zendesk Garden

## Zendesk Garden Prévia da interface do sistema de design

Alterne a visibilidade da resposta, valide um rascunho curto, salve uma captura local e limpe o próximo rascunho.

## Referência do sistema de design Zendesk Garden

Garden nativo 9.16.1 React ThemeProvider, Buttons e Forms; fluxo original de criação de rascunho local.

### Raio dos cantos

| Nome / Regra | Valor / Configuração | Uso |
| --- | --- | --- |
| borderRadii.sm | 2px | Escolha o formato conforme a função do componente; o canto médio padrão não é um formato de pílula. |
| borderRadii.md | 4px | Escolha o formato conforme a função do componente; o canto médio padrão não é um formato de pílula. |
| borderRadii.lg | 8px | Escolha o formato conforme a função do componente; o canto médio padrão não é um formato de pílula. |
### Pontos de quebra responsivos

| Nome / Regra | Valor / Configuração | Uso |
| --- | --- | --- |
| breakpoints.xs | 0px | Pontos de quebra do tema, não uma garantia de que a aplicação alterne todas as regiões em cada etapa. |
| breakpoints.sm | 576px | Pontos de quebra do tema, não uma garantia de que a aplicação alterne todas as regiões em cada etapa. |
| breakpoints.md | 768px | Pontos de quebra do tema, não uma garantia de que a aplicação alterne todas as regiões em cada etapa. |
| breakpoints.lg | 992px | Pontos de quebra do tema, não uma garantia de que a aplicação alterne todas as regiões em cada etapa. |
| breakpoints.xl | 1200px | Pontos de quebra do tema, não uma garantia de que a aplicação alterne todas as regiões em cada etapa. |
### Tamanhos de fonte

| Nome / Regra | Valor / Configuração | Uso |
| --- | --- | --- |
| fontSizes.xs | 10px | Mantenha distintas as funções de corpo, rótulo, metadados e título. |
| fontSizes.sm | 12px | Mantenha distintas as funções de corpo, rótulo, metadados e título. |
| fontSizes.md | 14px | Mantenha distintas as funções de corpo, rótulo, metadados e título. |
| fontSizes.lg | 18px | Mantenha distintas as funções de corpo, rótulo, metadados e título. |
| fontSizes.xl | 22px | Mantenha distintas as funções de corpo, rótulo, metadados e título. |
| fontSizes.xxl | 26px | Mantenha distintas as funções de corpo, rótulo, metadados e título. |
| fontSizes.xxxl | 36px | Mantenha distintas as funções de corpo, rótulo, metadados e título. |
### Alturas de linha

| Nome / Regra | Valor / Configuração | Uso |
| --- | --- | --- |
| lineHeights.sm | 16px | Use em conjunto com a função de texto; não derive todas as alturas de linha do tamanho da fonte. |
| lineHeights.md | 20px | Use em conjunto com a função de texto; não derive todas as alturas de linha do tamanho da fonte. |
| lineHeights.lg | 24px | Use em conjunto com a função de texto; não derive todas as alturas de linha do tamanho da fonte. |
| lineHeights.xl | 28px | Use em conjunto com a função de texto; não derive todas as alturas de linha do tamanho da fonte. |
| lineHeights.xxl | 32px | Use em conjunto com a função de texto; não derive todas as alturas de linha do tamanho da fonte. |
| lineHeights.xxxl | 44px | Use em conjunto com a função de texto; não derive todas as alturas de linha do tamanho da fonte. |
### Escala de espaçamento

| Nome / Regra | Valor / Configuração | Uso |
| --- | --- | --- |
| space.base | 4 | Valores de espaçamento do tema para manter um ritmo previsível. |
| space.xxs | 4px | Valores de espaçamento do tema para manter um ritmo previsível. |
| space.xs | 8px | Valores de espaçamento do tema para manter um ritmo previsível. |
| space.sm | 12px | Valores de espaçamento do tema para manter um ritmo previsível. |
| space.md | 20px | Valores de espaçamento do tema para manter um ritmo previsível. |
| space.lg | 32px | Valores de espaçamento do tema para manter um ritmo previsível. |
| space.xl | 40px | Valores de espaçamento do tema para manter um ritmo previsível. |
| space.xxl | 48px | Valores de espaçamento do tema para manter um ritmo previsível. |
### Mapeamento de funções semânticas para o tema claro

| Nome / Regra | Valor / Configuração | Uso |
| --- | --- | --- |
| colors.variables.light.background.default | palette.white | Alias de função do tema; resolva-o por meio do matiz e da paleta selecionados, em vez de tratá-lo como uma cor CSS literal. |
| colors.variables.light.background.subtle | neutralHue.100 | Alias de função do tema; resolva-o por meio do matiz e da paleta selecionados, em vez de tratá-lo como uma cor CSS literal. |
| colors.variables.light.background.danger | dangerHue.100 | Alias de função do tema; resolva-o por meio do matiz e da paleta selecionados, em vez de tratá-lo como uma cor CSS literal. |
| colors.variables.light.background.primaryEmphasis | primaryHue.700 | Alias de função do tema; resolva-o por meio do matiz e da paleta selecionados, em vez de tratá-lo como uma cor CSS literal. |
| colors.variables.light.foreground.default | neutralHue.900 | Alias de função do tema; resolva-o por meio do matiz e da paleta selecionados, em vez de tratá-lo como uma cor CSS literal. |
| colors.variables.light.foreground.subtle | neutralHue.700 | Alias de função do tema; resolva-o por meio do matiz e da paleta selecionados, em vez de tratá-lo como uma cor CSS literal. |
| colors.variables.light.foreground.onEmphasis | palette.white | Alias de função do tema; resolva-o por meio do matiz e da paleta selecionados, em vez de tratá-lo como uma cor CSS literal. |
| colors.variables.light.foreground.primary | primaryHue.700 | Alias de função do tema; resolva-o por meio do matiz e da paleta selecionados, em vez de tratá-lo como uma cor CSS literal. |
| colors.variables.light.foreground.danger | dangerHue.700 | Alias de função do tema; resolva-o por meio do matiz e da paleta selecionados, em vez de tratá-lo como uma cor CSS literal. |
| colors.variables.light.border.default | neutralHue.300 | Alias de função do tema; resolva-o por meio do matiz e da paleta selecionados, em vez de tratá-lo como uma cor CSS literal. |
| colors.variables.light.border.subtle | neutralHue.200 | Alias de função do tema; resolva-o por meio do matiz e da paleta selecionados, em vez de tratá-lo como uma cor CSS literal. |
| colors.variables.light.border.danger | dangerHue.300 | Alias de função do tema; resolva-o por meio do matiz e da paleta selecionados, em vez de tratá-lo como uma cor CSS literal. |
| colors.variables.light.border.primaryEmphasis | primaryHue.700 | Alias de função do tema; resolva-o por meio do matiz e da paleta selecionados, em vez de tratá-lo como uma cor CSS literal. |
## Guia completo do sistema de design Zendesk Garden

Um guia prático para escolher, aplicar e avaliar este sistema em uma interface real.

Orientações completas, um ponto de partida para a implementação e links para o código-fonte.

## Estrutura do espaço de trabalho de suporte do sistema de design Zendesk Garden

### Mantenha a solicitação do cliente à vista

> Um editor de respostas de suporte precisa de contexto suficiente para evitar uma resposta bem apresentada, mas irrelevante. O exemplo exibe a solicitação do cliente acima do rascunho, com a pessoa solicitante, a organização e o assunto ao lado. A interface é compacta o bastante para permitir comparar o novo texto com a pergunta original sem trocar de tela.

### Separe o histórico do rascunho ativo

As entradas locais salvas aparecem acima do editor com um rótulo explícito de visibilidade. O rascunho ativo permanece no Textarea nativo. Ao salvar, uma captura é adicionada e o campo é limpo, impedindo que edições posteriores alterem silenciosamente uma nota já salva.

## Funções e paleta do tema do sistema de design Zendesk Garden

### Entenda os aliases antes de copiar cores

O DEFAULT_THEME do Garden 9 mapeia funções semânticas para famílias de matizes e valores numerados da paleta. Uma função como background.primaryEmphasis não é um valor hexadecimal literal. A tabela de referência mantém esses aliases para que um tema personalizado possa alterar o matiz primário sem deixar trechos azuis codificados diretamente nos controles nativos.

### Mantenha as áreas criadas compatíveis com o provider

ThemeProvider fornece a estilização dos componentes nativos. Este exemplo usa DEFAULT_THEME e um espaço de trabalho personalizado claro correspondente; não adiciona uma alternância fictícia de modo escuro que só altera o fundo ao redor. Se adicionar suporte a esquemas de cores, adapte as cores personalizadas das mensagens e da barra lateral junto com as do provider.

## Tipografia e densidade do sistema de design Zendesk Garden

### Mantenha legível o texto de trabalho de 14px

O tema padrão oferece uma função média de 14px e uma altura de linha média de 20px, além de funções distintas de 12px para informações auxiliares e de 18px para títulos. O exemplo usa um título de ticket de 26px e metadados contextuais menores. A mensagem original do cliente e as notas salvas permanecem no texto normal do corpo, em vez de serem reduzidas a rótulos.

### Permita que respostas longas quebrem linhas naturalmente

O texto salvo preserva as quebras de linha e ajusta palavras longas à largura disponível. Assim, uma tela estreita de celular mantém a nota inteira visível sem exigir rolagem horizontal. O editor cresce verticalmente por meio do textarea, sem transformar todo o histórico de mensagens em uma área com rolagem interna.

## Composição de campos e botões do sistema de design Zendesk Garden

### Associe o rótulo, a orientação e o erro

O Field nativo agrupa Label, Hint, Textarea e Message condicional. A propriedade de validação altera a aparência do textarea quando a regra de comprimento mínimo definida pela aplicação não é atendida. Isso segue a composição do componente, em vez de aplicar a cor de erro a um parágrafo não relacionado fora do campo.

### Use um controle próprio para a visibilidade

Um Select nativo permite escolher Resposta pública ou Nota interna. O rótulo e a orientação são atualizados conforme o modo, e a captura salva mantém esse modo. A ação continua sendo Salvar rascunho local nas duas opções, deixando claro que selecionar Resposta pública não envia uma mensagem.

## Estado do rascunho e histórico local do sistema de design Zendesk Garden

### Valide antes de adicionar uma mensagem

A aplicação exige pelo menos doze caracteres após remover os espaços nas extremidades. Se o envio falhar, o rascunho permanece intacto, uma mensagem aparece no campo e o foco volta para o textarea. A edição limpa o erro antigo; um envio posterior verifica novamente o texto atual. Essa regra é um comportamento da aplicação, não um padrão não documentado do Garden.

### Diferencie visualmente as notas internas

As entradas internas têm um fundo acolhedor e o rótulo escrito Rascunho de nota interna. As entradas públicas usam a superfície padrão. Ambas indicam explicitamente que não foram enviadas. Essa distinção demonstra o contexto de visibilidade sem imitar uma conversa ativa do Zendesk nem sugerir que outra pessoa recebeu algo.

## Áreas de trabalho responsivas do sistema de design Zendesk Garden

### Coloque o contexto abaixo da tarefa principal

No ponto de quebra da aplicação, o contexto do ticket passa para baixo da conversa e do editor. A ordem do documento subjacente permanece a mesma. Em um celular, o controle de visibilidade ocupa toda a largura disponível e a linha de ações quebra para que os rótulos dos botões não fiquem comprimidos.

### Use raios moderados e divisórias finas

Os controles nativos usam a escala de raios de 2px, 4px e 8px. Os painéis da mensagem original usam cantos de 4px e bordas sutis. O destaque visual mais forte deve ficar na ação ativa e no estado de validação, não em sombras ao redor de cada mensagem.

## Validação e recuperação pelo teclado do sistema de design Zendesk Garden

### Teste todo o fluxo de criação de rascunho

Um teste útil começa com um envio inválido e, em seguida, verifica se digitar, alterar a visibilidade, salvar e limpar mantêm a interface compreensível. O código usa uma ref React para restaurar o foco após um erro ou uma ação de limpeza. A contagem de resultados é anunciada em uma região de status.

1. Envie um rascunho curto e verifique o erro no campo.

2. Selecione Nota interna, escreva uma nota útil e salve.

3. Limpe um rascunho posterior e confirme que a captura local salva permanece.

### Mantenha uma ordem de leitura estável

A solicitação vem antes do rascunho, e as novas capturas locais salvas permanecem em ordem cronológica. Os botões nativos apresentam suas ações como texto. Não há atalhos de teclado nem envio automático ocultos no editor, e a escolha de visibilidade permanece em um select com rótulo.

## Integração React do sistema de design Zendesk Garden

### Instale versões compatíveis dos pacotes

O exemplo fixa a tematização, os botões e os formulários na versão 9.16.1 e usa React 18 com styled-components. Misturar versões mais antigas dos pacotes Garden pode gerar expectativas incompatíveis em relação ao tema. A entrada JSX completa inclui o provider, a composição do campo e o estado local, enquanto o arquivo CSS contém somente o layout definido aqui.

- @zendeskgarden/react-theming 9.16.1

- @zendeskgarden/react-buttons 9.16.1

- @zendeskgarden/react-forms 9.16.1

### Estenda somente a camada de serviço ausente

Para que isso se torne uma ferramenta de suporte de verdade, adicione dados de tickets autorizados, verificações de permissão e um envio ou rascunho verificado API, com estados de processamento e falha. Mantenha a semântica de captura local até que essas respostas existam. Não altere o rótulo do botão para Enviar apenas porque a validação do formulário foi aprovada.

## Exemplos de componentes do sistema de design Zendesk Garden

### main.jsx — exemplo funcional completo

Escreva uma resposta com o contexto do cliente à vista. O código abaixo é a entrada React completa, incluindo todos os estados e a validação.

```
import React, { useState, useRef } from "react";
import { createRoot } from "react-dom/client";
import { ThemeProvider, DEFAULT_THEME } from "@zendeskgarden/react-theming";
import { Button } from "@zendeskgarden/react-buttons";
import {
  Field,
  Label,
  Textarea,
  Hint,
  Message,
  Select,
} from "@zendeskgarden/react-forms";
import "./garden.css";
function App() {
  const [mode, setMode] = useState("public"),
    [text, setText] = useState(""),
    [error, setError] = useState(false),
    [items, setItems] = useState([]);
  const ref = useRef();
  function submit(e) {
    e.preventDefault();
    if (text.trim().length < 12) {
      setError(true);
      ref.current.focus();
      return;
    }
    setItems([...items, { mode, text: text.trim() }]);
    setText("");
    setError(false);
  }
  return (
    <ThemeProvider theme={DEFAULT_THEME}>
      <main className="garden-workspace">
        <header>
          <span>SUPPORT WORKSPACE / FICTIONAL TICKET</span>
          <h1>Help with an invoice address</h1>
          <p>Ticket #1028 · Nadia Walker · Email channel</p>
        </header>
        <div className="garden-grid">
          <section>
            <div className="message customer">
              <strong>Nadia Walker</strong>
              <small>Customer · example message</small>
              <p>
                Could you update the company address on our next invoice? The
                billing contact has changed.
              </p>
            </div>
            {items.map((i, n) => (
              <article className={"message " + i.mode} key={n}>
                <strong>
                  {i.mode === "public"
                    ? "Public reply draft"
                    : "Internal note draft"}
                </strong>
                <small>Saved locally · not sent</small>
                <p>{i.text}</p>
              </article>
            ))}
            <form onSubmit={submit} noValidate>
              <div className="composer-head">
                <h2>Compose a draft</h2>
                <Field>
                  <Label>Visibility</Label>
                  <Select
                    value={mode}
                    onChange={(e) => setMode(e.target.value)}
                  >
                    <option value="public">Public reply</option>
                    <option value="internal">Internal note</option>
                  </Select>
                </Field>
              </div>
              <Field>
                <Label>
                  {mode === "public" ? "Reply text" : "Internal note"}
                </Label>
                <Hint>
                  {mode === "public"
                    ? "Prepared for the customer; this demo will not send it."
                    : "Internal context for the support team; saved only in this page."}
                </Hint>
                <Textarea
                  ref={ref}
                  value={text}
                  rows={5}
                  validation={error ? "error" : undefined}
                  onChange={(e) => {
                    setText(e.target.value);
                    setError(false);
                  }}
                />
                {error && (
                  <Message validation="error">
                    Write at least 12 characters.
                  </Message>
                )}
              </Field>
              <div className="composer-actions">
                <span>{text.length} characters</span>
                <Button
                  type="button"
                  onClick={() => {
                    setText("");
                    setError(false);
                    ref.current.focus();
                  }}
                >
                  Clear draft
                </Button>
                <Button isPrimary type="submit">
                  Save local draft
                </Button>
              </div>
            </form>
            <p role="status">
              {items.length > 0
                ? `${items.length} draft${items.length === 1 ? "" : "s"} saved locally. No message sent.`
                : ""}
            </p>
          </section>
          <aside>
            <h2>Ticket context</h2>
            <dl>
              <dt>Requester</dt>
              <dd>Nadia Walker</dd>
              <dt>Organization</dt>
              <dd>Northstar Studio</dd>
              <dt>Priority</dt>
              <dd>Normal</dd>
              <dt>Topic</dt>
              <dd>Billing details</dd>
            </dl>
            <div className="context-note">
              <h3>Before replying</h3>
              <ul>
                <li>Confirm the billing contact.</li>
                <li>Keep invoice identifiers out of public examples.</li>
                <li>State whether the change affects future invoices.</li>
              </ul>
            </div>
          </aside>
        </div>
        <footer>
          Native Garden 9.16.1 React components. Original local drafting
          workflow; no Zendesk connection.
        </footer>
      </main>
    </ThemeProvider>
  );
}
createRoot(document.getElementById("root")).render(<App />);
```

Referência de código

- Crie um projeto Vite React, mantenha <div id="root"></div> e carregue este arquivo como src/main.jsx.

### garden.css — composição responsiva original

Layout da aplicação organizado em torno dos componentes nativos.

```
* {
  box-sizing: border-box;
}
body {
  margin: 0;
  font:
    14px/1.5 system-ui,
    sans-serif;
  color: #293239;
  background: #f8f9f9;
}
.garden-workspace header {
  padding: 24px 32px;
  background: white;
  border-bottom: 1px solid #d8dcde;
}
.garden-workspace header span {
  font-size: 10px;
  letter-spacing: 0.08em;
  color: #5c6970;
}
.garden-workspace h1 {
  font-size: 26px;
  line-height: 1.3;
  margin: 8px 0;
}
.garden-workspace header p {
  color: #5c6970;
  margin: 0;
}
.garden-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 280px;
  gap: 24px;
  padding: 24px 32px;
}
.message {
  padding: 20px;
  background: white;
  border: 1px solid #d8dcde;
  border-radius: 4px;
  margin-bottom: 16px;
}
.message p {
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  margin: 12px 0 0;
}
.message small {
  display: block;
  color: #5c6970;
  margin-top: 4px;
}
.message.internal {
  background: #fff8ed;
  border-color: #e7ce99;
}
form {
  padding: 24px;
  background: white;
  border: 1px solid #d8dcde;
  border-radius: 4px;
}
.composer-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  margin-bottom: 24px;
}
.composer-head > div {
  max-width: 220px;
}
.garden-workspace h2 {
  font-size: 18px;
  margin: 0 0 12px;
}
.composer-actions {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 12px;
  margin-top: 20px;
}
.composer-actions span {
  font-size: 12px;
  color: #5c6970;
  margin-right: auto;
}
.garden-grid aside {
  background: white;
  border: 1px solid #d8dcde;
  border-radius: 4px;
  padding: 20px;
  align-self: start;
}
dl {
  margin: 0;
}
dt {
  font-size: 12px;
  color: #5c6970;
  margin-top: 16px;
}
dd {
  margin: 4px 0 0;
  font-weight: 600;
}
.context-note {
  margin-top: 24px;
  border-top: 1px solid #e8eaec;
  padding-top: 16px;
}
.context-note h3 {
  font-size: 14px;
}
.context-note ul {
  padding-left: 18px;
  font-size: 12px;
}
.context-note li {
  margin: 8px 0;
}
footer {
  padding: 16px 32px;
  font-size: 12px;
  color: #5c6970;
  border-top: 1px solid #d8dcde;
  background: white;
}
@media (max-width: 850px) {
  .garden-grid {
    grid-template-columns: 1fr;
  }
}
@media (max-width: 550px) {
  .garden-grid {
    padding: 16px;
  }
  .garden-workspace header {
    padding: 20px 16px;
  }
  .composer-head {
    display: block;
  }
  .composer-head > div {
    max-width: none;
  }
  .composer-actions {
    flex-wrap: wrap;
    justify-content: flex-start;
  }
  .composer-actions span {
    width: 100%;
  }
  form {
    padding: 16px;
  }
}
```

Referência de código

- Salve junto de main.jsx. Estas regras de composição personalizadas são distintas da referência de tokens da biblioteca.

## Configuração do agente do sistema de design Zendesk Garden

### Ponto de partida para implementação

O exemplo nativo com versões fixadas foi empacotado e verificado localmente no navegador. O exemplo usa apenas o estado local da aplicação.

```
npm create vite@latest garden-draft -- --template react
cd garden-draft
npm install
npm install react@18.3.1 react-dom@18.3.1 styled-components @zendeskgarden/react-theming@9.16.1 @zendeskgarden/react-buttons@9.16.1 @zendeskgarden/react-forms@9.16.1
# Replace src/main.jsx and add src/garden.css.
npm run dev
```

### Um prompt para seu projeto

```
Crie um editor de respostas de suporte Garden com a composição nativa de Field/Label/Hint/Textarea/Message. Mantenha a visibilidade em cada captura de rascunho salva, valide antes de adicionar, preserve o contexto do cliente e diferencie salvar localmente de enviar. Use as funções exatas do tema e o código-fonte completo disponíveis aqui.
```

## Fontes e escopo do sistema de design Zendesk Garden

Guia da aplicação OpenDesign. Os componentes nativos do Garden renderizam o exemplo; o conteúdo fictício do ticket e os rascunhos locais não se conectam ao Zendesk nem enviam mensagens.

- Formulários Garden Composição nativa de Field, Label e validação.

- Botões Garden Variantes de ação e tamanhos compatíveis.

- Fonte do tema Aliases, paleta e escalas de DEFAULT_THEME.

## Recursos relacionados ao sistema de design Zendesk Garden

### Adeo Mozaic

Crie uma composição prática de controle de quantidade usando a unidade mágica de 16 px da Mozaic, controles correspondentes de 48 px, imports SCSS reais e classes BEM. O planejador de prateleiras permite observar limites, erros tipados e um resumo local de materiais.

### Adobe Spectrum

Conheça o Spectrum v3 da React com uma tabela selecionável de recursos criativos e um inspetor de predefinições de exportação. Entenda os temas Provider e a escala de entrada, as propriedades de estilo compatíveis, as coleções com chaves e a diferença entre o v3 e a implementação mais recente do Spectrum 2.

### Alaska Airlines Auro

Explore o tema Alaska da Auro com tokens reais de cores semânticas e tipografia, tipografia baseada em classes e o componente nativo de voo. Dois registros originais de voos demonstram filtragem e seleção locais, sem representar inventário ou reservas de companhias aéreas.


- [Referência de implementação](https://garden.zendesk.com/components/input/)
- [Fonte](https://github.com/zendeskgarden/react-components/tree/main/packages/theming)
- [Referência de código](https://garden.zendesk.com/components/input/)
- [Formulários Garden Composição nativa de Field, Label e validação.](https://garden.zendesk.com/components/input/)
- [Botões Garden Variantes de ação e tamanhos compatíveis.](https://garden.zendesk.com/components/button/)
- [Fonte do tema Aliases, paleta e escalas de DEFAULT_THEME.](https://github.com/zendeskgarden/react-components/tree/main/packages/theming)
