# frappe_ui_phx v0.3.1 - API Reference

## Modules

- [FrappeUIPhx](FrappeUIPhx.md): Componentes Phoenix LiveView com a identidade visual do Frappe UI.
- [FrappeUIPhx.Calendar](FrappeUIPhx.Calendar.md): Aritmética de calendário pura usada pelo DatePicker (semana começando no domingo).
- [FrappeUIPhx.Charts.Axes](FrappeUIPhx.Charts.Axes.md): Grade horizontal, rótulos do eixo Y e rótulos de categorias (SVG).
- [FrappeUIPhx.Charts.Bar](FrappeUIPhx.Charts.Bar.md): Gráfico de barras agrupadas (SVG no servidor, cores do tema, estados loading/empty/error).
- [FrappeUIPhx.Charts.Cartesian](FrappeUIPhx.Charts.Cartesian.md): Geometria compartilhada pelos gráficos de eixos (barras, linhas, áreas):
área de plotagem, escala Y, posições X por categoria e grade. Funções puras.

- [FrappeUIPhx.Charts.ChartCard](FrappeUIPhx.Charts.ChartCard.md): Cartão que enquadra um gráfico: título, subtítulo, ações e o gráfico no corpo.
- [FrappeUIPhx.Charts.Donut](FrappeUIPhx.Charts.Donut.md): Gráfico de rosca (SVG no servidor). `data` é `[%{label, value}]`; valores ≤ 0 são ignorados.
- [FrappeUIPhx.Charts.Frame](FrappeUIPhx.Charts.Frame.md): Moldura comum dos gráficos com os estados `:loading`, `:empty` e `:error`
(visualmente distintos); no estado `:ready` mostra o gráfico.

- [FrappeUIPhx.Charts.Legend](FrappeUIPhx.Charts.Legend.md): Legenda: marcador colorido + nome. `items` é `[%{label, color}]` ou vem das séries.
- [FrappeUIPhx.Charts.Line](FrappeUIPhx.Charts.Line.md): Gráficos de linha e de área (SVG no servidor), com pontos, dicas e estados.
- [FrappeUIPhx.Charts.Matrix](FrappeUIPhx.Charts.Matrix.md): Mapas de calor: matriz linhas × colunas e calendário (estilo contribuições).
- [FrappeUIPhx.Charts.NumberCard](FrappeUIPhx.Charts.NumberCard.md): Cartão de indicador: rótulo, valor grande e variação percentual opcional (verde sobe, vermelho cai).
- [FrappeUIPhx.Charts.Proportion](FrappeUIPhx.Charts.Proportion.md): Gráficos de proporção: barra percentual empilhada e funil.
- [FrappeUIPhx.Charts.Sankey](FrappeUIPhx.Charts.Sankey.md): Diagrama de Sankey: `links` é `[%{source, target, value}]`; os nós e as colunas
(profundidade) são derivados dos links. Ciclos não são suportados e falham alto.

- [FrappeUIPhx.Charts.Scale](FrappeUIPhx.Charts.Scale.md): Matemática pura dos gráficos: escalas lineares, "números bonitos" para eixos,
paleta de cores do tema e formatação numérica estável para SVG.

- [FrappeUIPhx.Charts.Scatter](FrappeUIPhx.Charts.Scatter.md): Gráfico de dispersão: séries de pontos `{x, y}` em eixos numéricos.
- [FrappeUIPhx.Charts.Tooltip](FrappeUIPhx.Charts.Tooltip.md): Dica de um ponto de dado, desenhada em SVG: aparece quando o pai tem a classe
`group` e está em hover/foco (CSS puro). Complementa o `<title>` nativo.

- [FrappeUIPhx.Components](FrappeUIPhx.Components.md): Catálogo de componentes: módulo, função, categoria e título. Fonte única usada
por `use FrappeUIPhx` (imports), pelo mostruário (navegação e especificação)
e pelo teste que garante que nenhum componente público fica sem catálogo.

- [FrappeUIPhx.Components.Accordion](FrappeUIPhx.Components.Accordion.md): Seções recolhíveis sobre `<details>` nativo (teclado e leitores de tela de graça).
Por padrão só uma seção fica aberta por vez (atributo `name` do HTML, agrupado
pelo `id`); com `multiple`, qualquer combinação. `open` no item abre desde o servidor.
- [FrappeUIPhx.Components.Action](FrappeUIPhx.Components.Action.md): Único lugar onde se decide "link ou botão" para um item de ação (navegação, abas,
menus). `NavItem`, `MenuItem` e `Tabs` renderizam por aqui.
- [FrappeUIPhx.Components.Alert](FrappeUIPhx.Components.Alert.md): Alerta com título, descrição e ação opcional. Temas `gray | blue | green | amber | red`.
- [FrappeUIPhx.Components.Anchor](FrappeUIPhx.Components.Anchor.md): Posicionamento de flutuantes por CSS Anchor Positioning (sem JS).
- [FrappeUIPhx.Components.Avatar](FrappeUIPhx.Components.Avatar.md): Avatar com imagem ou iniciais do `label`. Formas `circle | square`.
- [FrappeUIPhx.Components.Badge](FrappeUIPhx.Components.Badge.md): Selo de status: temas `gray | blue | green | amber | red | violet`, variantes `solid | subtle | outline | ghost`.
- [FrappeUIPhx.Components.BottomSheet](FrappeUIPhx.Components.BottomSheet.md): Folha inferior (mobile): um `Dialog` com `placement: :bottom`; abre/fecha com `show_dialog/1` e `hide_dialog/1`.
- [FrappeUIPhx.Components.Breadcrumbs](FrappeUIPhx.Components.Breadcrumbs.md): Trilha de navegação; o último item é a página atual (`aria-current="page"`).
- [FrappeUIPhx.Components.Button](FrappeUIPhx.Components.Button.md): Botão do Frappe UI: variantes `solid | subtle | outline | ghost`, temas
`gray | blue | green | red`, tamanhos `xs | sm | md | lg`.
- [FrappeUIPhx.Components.Calendar](FrappeUIPhx.Components.Calendar.md): Calendário mensal com eventos (visão de agenda). O mês exibido e o dia
selecionado são assigns do servidor; navegar e escolher são eventos
(`on_prev`, `on_next`, `on_today`, `on_select` com `%{"date" => "2026-03-09"}`).
- [FrappeUIPhx.Components.Checkbox](FrappeUIPhx.Components.Checkbox.md): Caixa de seleção com rótulo opcional. Emite o `hidden` com `"false"` como o
`core_components` do Phoenix, para que o desmarcado chegue ao servidor.

- [FrappeUIPhx.Components.CodeEditor](FrappeUIPhx.Components.CodeEditor.md): Editor de código: `<textarea>` monoespaçado com numeração de linhas, tecla Tab
que indenta e rótulo da linguagem. É um campo de formulário comum (`name`,
`phx-change`, `field`).
- [FrappeUIPhx.Components.Combobox](FrappeUIPhx.Components.Combobox.md): Seleção única com busca. Aceita `field` (Phoenix/Ecto); a escolha é um radio nativo do formulário.
- [FrappeUIPhx.Components.CommandPalette](FrappeUIPhx.Components.CommandPalette.md): Paleta de comandos (Ctrl/⌘ + K): busca, grupos e navegação por teclado. Abre
como o `Dialog` (mesmo hook nativo: foco preso, Esc, backdrop) e o hook próprio só
filtra a lista, move a seleção com ↑/↓ e aciona o item com Enter. O que cada
item *faz* é decidido pelo servidor (`click`) ou por navegação.
- [FrappeUIPhx.Components.ContextMenu](FrappeUIPhx.Components.ContextMenu.md): Menu de contexto (botão direito) sobre uma região. O hook colocated só
posiciona e abre o `popover` no cursor; o que cada item faz é decidido pelo
servidor (`click`) ou por navegação.

- [FrappeUIPhx.Components.DatePicker](FrappeUIPhx.Components.DatePicker.md): Seletor de data com calendário (LiveComponent: o mês exibido é estado próprio).
- [FrappeUIPhx.Components.DesktopShell](FrappeUIPhx.Components.DesktopShell.md): Casca de página para desktop: `:sidebar` à esquerda e o conteúdo rolável à direita.
- [FrappeUIPhx.Components.Dialog](FrappeUIPhx.Components.Dialog.md): Diálogo modal sobre `<dialog>` nativo (foco preso, Esc e backdrop pelo navegador).
- [FrappeUIPhx.Components.DiceBearAvatar](FrappeUIPhx.Components.DiceBearAvatar.md): Avatar gerado pelo [DiceBear](https://www.dicebear.com/) a partir de uma `seed`:
a mesma `style` + `seed` + `options` dá sempre o mesmo desenho. Mesmos tamanhos e
formas do `FrappeUIPhx.Components.Avatar`, de quem herda o visual (composição).
- [FrappeUIPhx.Components.Divider](FrappeUIPhx.Components.Divider.md): Linha divisória horizontal ou vertical.
- [FrappeUIPhx.Components.Dropdown](FrappeUIPhx.Components.Dropdown.md): Menu suspenso sem JavaScript: Popover API (light-dismiss e Esc nativos) +
CSS Anchor Positioning (inverte para cima quando falta espaço).
- [FrappeUIPhx.Components.Duration](FrappeUIPhx.Components.Duration.md): Campo de duração: mostra `1h 30m` quando o valor são segundos e aceita o que
`FrappeUIPhx.Duration` entende. Combine com `FrappeUIPhx.Ecto.Duration` no schema.

- [FrappeUIPhx.Components.Editor](FrappeUIPhx.Components.Editor.md): Editor de texto rico (negrito, itálico, título, listas, código, link) que
guarda **Markdown** num `<input type=hidden>`, então participa do formulário e
do `phx-change` como qualquer campo.
- [FrappeUIPhx.Components.ErrorMessage](FrappeUIPhx.Components.ErrorMessage.md): Mensagem(ns) de erro. Aceita uma string, uma lista de strings ou `nil` (não renderiza nada).
- [FrappeUIPhx.Components.FileUploader](FrappeUIPhx.Components.FileUploader.md): Área de envio sobre `allow_upload/3` do LiveView: arrastar-e-soltar, lista de
arquivos com progresso, cancelamento e erros em português. Quem decide o que
fazer com o arquivo (`consume_uploaded_entries/3`) é o servidor.
- [FrappeUIPhx.Components.FormControl](FrappeUIPhx.Components.FormControl.md): Rótulo + controle + descrição + erros, escolhendo o controle por `type`.
- [FrappeUIPhx.Components.FormLabel](FrappeUIPhx.Components.FormLabel.md): Rótulo de campo; `required` acrescenta o asterisco e deve espelhar o `required` do controle.
- [FrappeUIPhx.Components.HoverCard](FrappeUIPhx.Components.HoverCard.md): Cartão que aparece em hover ou foco do gatilho, com pequeno atraso (CSS puro).
- [FrappeUIPhx.Components.Icon](FrappeUIPhx.Components.Icon.md): Ícone Lucide por nome, renderizado como `<svg>` inline (veja `FrappeUIPhx.Icons`).
- [FrappeUIPhx.Components.InputStyle](FrappeUIPhx.Components.InputStyle.md): Classes compartilhadas por TextInput, Textarea e Select (função pura).
- [FrappeUIPhx.Components.ItemListRow](FrappeUIPhx.Components.ItemListRow.md): Linha de lista com ícone, título, subtítulo e ações; navegável por `navigate`/`patch`/`href`.
- [FrappeUIPhx.Components.KeyboardShortcut](FrappeUIPhx.Components.KeyboardShortcut.md): Atalho de teclado: uma `<kbd>` por tecla (`keys={["Ctrl", "K"]}`).
- [FrappeUIPhx.Components.KeyboardShortcutsDialog](FrappeUIPhx.Components.KeyboardShortcutsDialog.md): Diálogo com a lista de atalhos: `shortcuts={[%{label: "Buscar", keys: ["Ctrl", "K"]}]}`.
- [FrappeUIPhx.Components.List](FrappeUIPhx.Components.List.md): Tabela de objetos: colunas por slot (`:col`), ações por linha (`:action`),
seleção por checkbox e reordenação por arrastar-e-soltar. O estado
(`selected`, ordem de `rows`) vive no servidor; cada interação é um evento.
- [FrappeUIPhx.Components.ListView](FrappeUIPhx.Components.ListView.md): Lista agrupada e recolhível: `group_by` (função linha → rótulo) forma os
grupos; os recolhidos (`collapsed`) são um assign do servidor e o cabeçalho de
cada grupo dispara `on_toggle` com `%{"group" => rótulo}`. Colunas por slot,
como em `list`. Experimental.

- [FrappeUIPhx.Components.LoadingText](FrappeUIPhx.Components.LoadingText.md): Texto de carregamento com spinner.
- [FrappeUIPhx.Components.MenuItem](FrappeUIPhx.Components.MenuItem.md): Item de menu (Dropdown, ContextMenu): navega (`navigate`/`patch`/`href`) ou
dispara evento (`click`) e fecha o popover pai. Tema `:gray` ou `:red`.

- [FrappeUIPhx.Components.MobileShell](FrappeUIPhx.Components.MobileShell.md): Casca para telas estreitas: cabeçalho, conteúdo rolável e navegação inferior (`:nav`).
- [FrappeUIPhx.Components.MultiSelect](FrappeUIPhx.Components.MultiSelect.md): Seleção múltipla com busca e selos. Envia `name[]` (mais um `""` para permitir
esvaziar); combine com `FrappeUIPhx.Ecto.StringList`, que descarta o vazio.

- [FrappeUIPhx.Components.NavItem](FrappeUIPhx.Components.NavItem.md): Item de navegação com ícone e rótulo (Tabs, TabButtons, Sidebar, SidebarRail,
SettingsDialog, MobileShell). Navega por `patch`/`navigate`/`href` ou dispara `click`
(evento ou `%JS{}`) — a decisão "link ou botão" é de `FrappeUIPhx.Components.Action`.
O estado ativo é decidido por quem chama (assign do servidor).
- [FrappeUIPhx.Components.OptionList](FrappeUIPhx.Components.OptionList.md): Base de Combobox e MultiSelect: gatilho + painel (Popover API) com busca e
opções que são `<input type=radio|checkbox>` **nativos** — então a seleção já é
valor de formulário e dispara o `phx-change` sem nenhum JS de negócio.
- [FrappeUIPhx.Components.PageHeader](FrappeUIPhx.Components.PageHeader.md): Cabeçalho de página: breadcrumbs opcionais, título e ações.
- [FrappeUIPhx.Components.Password](FrappeUIPhx.Components.Password.md): Campo de senha com botão de mostrar/ocultar. A alternância é só visual
(`JS.toggle_attribute` no `type`); o valor **nunca** é reenviado ao HTML.

- [FrappeUIPhx.Components.PinCode](FrappeUIPhx.Components.PinCode.md): Código de verificação / PIN: uma caixa por caractere, com avanço automático,
Backspace que volta, setas, colar o código inteiro e preenchimento por SMS
(`autocomplete="one-time-code"`).
- [FrappeUIPhx.Components.Popover](FrappeUIPhx.Components.Popover.md): Painel flutuante com conteúdo livre: Popover API + CSS Anchor Positioning (sem JS).
- [FrappeUIPhx.Components.Progress](FrappeUIPhx.Components.Progress.md): Barra de progresso (`value` de 0 a 100) com rótulo e valor opcionais.
- [FrappeUIPhx.Components.RadioGroup](FrappeUIPhx.Components.RadioGroup.md): Grupo de opções exclusivas (`<input type=radio>` nativos); `options` como em `Select`.
- [FrappeUIPhx.Components.Rating](FrappeUIPhx.Components.Rating.md): Avaliação em estrelas (`1..max`). Cada estrela é um `<input type=radio>`, então
funciona em formulários e `phx-change`; o preenchimento vem do valor no servidor.
Combine com `FrappeUIPhx.Ecto.Rating` no schema.

- [FrappeUIPhx.Components.SavedIndicator](FrappeUIPhx.Components.SavedIndicator.md): Confirmação visual transitória ("Salvo") sem `useEffect`/timer: o servidor
devolve um valor que muda a cada sucesso (`at`, ex. um timestamp) e o `:key`
remonta o elemento, reiniciando a animação CSS que termina em opacidade 0.

- [FrappeUIPhx.Components.ScrollArea](FrappeUIPhx.Components.ScrollArea.md): Região rolável com barras finas e discretas (CSS nativo); focável para rolagem por teclado.
- [FrappeUIPhx.Components.Select](FrappeUIPhx.Components.Select.md): Seleção nativa. `options` aceita lista de strings, `{rótulo, valor}` ou
keyword; `prompt` adiciona uma primeira opção vazia.

- [FrappeUIPhx.Components.SettingsDialog](FrappeUIPhx.Components.SettingsDialog.md): Diálogo de configurações: navegação lateral por seções (`:tab`) e o conteúdo
da seção ativa. A seção ativa (`active`) é um assign do servidor.

- [FrappeUIPhx.Components.Sidebar](FrappeUIPhx.Components.Sidebar.md): Barra lateral de navegação. O item ativo (`active`) e o recolhimento
(`collapsed`) são assigns do servidor; recolhida, só os ícones aparecem.

- [FrappeUIPhx.Components.SidebarRail](FrappeUIPhx.Components.SidebarRail.md): Trilho estreito só com ícones (rótulo acessível e `title`); ativo por assign.
- [FrappeUIPhx.Components.Skeleton](FrappeUIPhx.Components.Skeleton.md): Bloco animado para estados de carregamento; dimensione por `class` (ex.: `h-4 w-32`).
- [FrappeUIPhx.Components.Slider](FrappeUIPhx.Components.Slider.md): Controle deslizante (`<input type=range>`); `min <= value <= max` é pré-condição.
- [FrappeUIPhx.Components.Sortable](FrappeUIPhx.Components.Sortable.md): Lista reordenável por arrastar-e-soltar (HTML5 nativo).
- [FrappeUIPhx.Components.Spinner](FrappeUIPhx.Components.Spinner.md): Indicador de carregamento; herda a cor do texto.
- [FrappeUIPhx.Components.Stepper](FrappeUIPhx.Components.Stepper.md): Indicador de etapas. A etapa atual (`current`, índice a partir de 0; igual ao
número de etapas = tudo concluído) é um assign do servidor, e o estado de cada
etapa (`:done | :current | :upcoming`) é derivado dele. Com `on_go`, as etapas
concluídas viram botões que voltam para elas (`%{"step" => índice}`). Experimental.

- [FrappeUIPhx.Components.Switch](FrappeUIPhx.Components.Switch.md): Interruptor. É um checkbox nativo (`peer`), então funciona em formulários sem JS.
- [FrappeUIPhx.Components.TabButtons](FrappeUIPhx.Components.TabButtons.md): Abas em formato de botões segmentados; a ativa é um assign do servidor (`active`).
- [FrappeUIPhx.Components.Tabs](FrappeUIPhx.Components.Tabs.md): Abas cujo item ativo é decidido por um assign (`active`), nunca por estado do
cliente. Cada `:tab` navega (`patch`/`navigate`) ou dispara evento (`click`).
O conteúdo do painel ativo vai no `inner_block`.

- [FrappeUIPhx.Components.TextInput](FrappeUIPhx.Components.TextInput.md): Campo de uma linha. Aceita `field={@form[:campo]}` (Phoenix/Ecto) ou
`name`/`value` avulsos. Restrições (`required`, `maxlength`, `min`, `pattern`,
`placeholder`...) vão direto ao `<input>`; o servidor continua sendo a
barreira real (o `required` aqui espelha a regra do changeset).

- [FrappeUIPhx.Components.Textarea](FrappeUIPhx.Components.Textarea.md): Campo de várias linhas; mesmo contrato de `FrappeUIPhx.Components.TextInput`.
- [FrappeUIPhx.Components.ThemeSwitcher](FrappeUIPhx.Components.ThemeSwitcher.md): Alternador claro/escuro. Cada opção é um link `?theme=…` tratado por
`FrappeUIPhx.Plug.Theme`, que persiste a escolha em sessão e cookie; o tema
atual (`current`) vem do servidor (`@frappe_ui_theme`). Experimental.

- [FrappeUIPhx.Components.TimePicker](FrappeUIPhx.Components.TimePicker.md): Seletor de horário (`<input type=time>` nativo, com o teclado/relógio do dispositivo); `step` em segundos.
- [FrappeUIPhx.Components.Toast](FrappeUIPhx.Components.Toast.md): Container de toasts: mostra mensagens de `flash` (renderizadas no servidor) e
as enviadas por `FrappeUIPhx.Toast.put_toast/4` (via hook colocated).

- [FrappeUIPhx.Components.Tooltip](FrappeUIPhx.Components.Tooltip.md): Dica visual sem JavaScript: aparece em hover e em foco do conteúdo envolvido.
- [FrappeUIPhx.Components.Tree](FrappeUIPhx.Components.Tree.md): Árvore de nós `%{id, label, icon, children}`. Expansão (`expanded`) e seleção
(`selected`) são assigns do servidor; cada clique é um evento
(`on_toggle`/`on_select` com `%{"id" => id}`). Com `on_drop`, os nós de um
mesmo nível podem ser reordenados por arrastar-e-soltar.

- [FrappeUIPhx.Config](FrappeUIPhx.Config.md): Resolve e **valida** o módulo configurado para um ponto de extensão
(`IconResolver`, `ToastSink`, `ErrorTranslator`, `Translator`). Um módulo inexistente
ou sem o callback falha na primeira chamada com mensagem clara, em vez de um
`UndefinedFunctionError` no meio da renderização.

- [FrappeUIPhx.Contract](FrappeUIPhx.Contract.md): Design by Contract para os componentes.
- [FrappeUIPhx.DiceBear](FrappeUIPhx.DiceBear.md): URL da [API HTTP do DiceBear](https://www.dicebear.com/integrations/http-api/)
(avatares gerados a partir de uma *seed*).
- [FrappeUIPhx.Duration](FrappeUIPhx.Duration.md): Duração em segundos ⇄ texto digitado (`1h 30m`, `90m`, `45s`, `1:30`, `1:30:15`, `5400`).
- [FrappeUIPhx.Ecto.Duration](FrappeUIPhx.Ecto.Duration.md): `Ecto.Type` para o campo Duration do Frappe UI: guarda **segundos** (inteiro
não negativo) e aceita no `cast` o que um usuário digita
- [FrappeUIPhx.Ecto.Options](FrappeUIPhx.Ecto.Options.md): Opções de `Select`/`Combobox` a partir de um campo `Ecto.Enum`, para que a
lista da tela e o domínio nunca divirjam
- [FrappeUIPhx.Ecto.Rating](FrappeUIPhx.Ecto.Rating.md): `Ecto.ParameterizedType` para avaliação em estrelas: inteiro de `0` a `max`
(padrão 5). Aceita string vindo do formulário.
- [FrappeUIPhx.Ecto.StringList](FrappeUIPhx.Ecto.StringList.md): `Ecto.Type` para listas de textos (tags, MultiSelect): persiste como
`{:array, :string}` e aceita no `cast` uma lista ou uma string separada por
vírgula. Descarta vazios e repetidos, preservando a ordem.
- [FrappeUIPhx.ErrorTranslator](FrappeUIPhx.ErrorTranslator.md): Contrato de tradução de erros de changeset `{mensagem, opções}`.
- [FrappeUIPhx.ErrorTranslator.Default](FrappeUIPhx.ErrorTranslator.Default.md): Tradutor padrão de erros de changeset: interpola `%{chave}` da mensagem com as opções
do erro, sem depender de Gettext nem do próprio Ecto.

- [FrappeUIPhx.Field](FrappeUIPhx.Field.md): Costura entre `Phoenix.HTML.FormField` (changeset/Ecto) e os controles.
- [FrappeUIPhx.Foundations](FrappeUIPhx.Foundations.md): Fundamentos visuais do Frappe UI (cores, tipografia, raios, sombras, anel de
foco e cores de gráficos) como **dados**, lidos de `priv/foundations.json`, que
`mix tokens.sync` gera da mesma fonte dos tokens do CSS. Alimenta as páginas de
Fundamentos do mostruário e serve de referência em código (ex.: listar tokens).

- [FrappeUIPhx.IconResolver](FrappeUIPhx.IconResolver.md): Contrato de como o nome de ícone usado no projeto vira um nome do catálogo Lucide
(`FrappeUIPhx.Icons`). Serve para apelidos do projeto (`"salvar"` -> `"save"`)
- [FrappeUIPhx.IconResolver.Lucide](FrappeUIPhx.IconResolver.Lucide.md): Resolvedor padrão: o nome já é do catálogo Lucide e passa direto.
- [FrappeUIPhx.Icons](FrappeUIPhx.Icons.md): Catálogo de ícones Lucide: nomes, tags, aliases (nomes antigos) e busca.
- [FrappeUIPhx.Icons.Lucide](FrappeUIPhx.Icons.Lucide.md): Um componente LiveView por ícone Lucide (atalhos de `FrappeUIPhx.Icons.Svg`).
- [FrappeUIPhx.Icons.Svg](FrappeUIPhx.Icons.Svg.md): Renderiza um ícone do catálogo como `<svg>` inline, com as propriedades do Lucide.
- [FrappeUIPhx.Installer](FrappeUIPhx.Installer.md): Edições idempotentes nos arquivos do app host (CSS, JS, `mix.exs`), em funções
puras `conteúdo -> {:ok, novo, mudou?} | {:error, motivo}`. A task
`mix frappe_ui_phx.install` só lê/escreve arquivos em volta delas.
- [FrappeUIPhx.Live.ThemeHook](FrappeUIPhx.Live.ThemeHook.md): `on_mount` que copia o tema resolvido por `FrappeUIPhx.Plug.Theme` (guardado
na sessão) para `socket.assigns.frappe_ui_theme`, mantendo o estado autoritativo
no servidor também dentro do LiveView.
- [FrappeUIPhx.Markdown](FrappeUIPhx.Markdown.md): Subconjunto **seguro** de Markdown usado pelo Editor: `## título`, listas
(`- ` e `1. `), parágrafos, `**negrito**`, `_itálico_`, `` `código` `` e
`[texto](https://url)`.
- [FrappeUIPhx.Plug.Static](FrappeUIPhx.Plug.Static.md): Serve `frappe_ui.css` (tokens) e `frappe_ui_icons.css` da própria dependência em `/frappe_ui/`,
para quem prefere `<link>` a `@import` no `app.css`.
- [FrappeUIPhx.Plug.Theme](FrappeUIPhx.Plug.Theme.md): Resolve o tema (`"light"` ou `"dark"`) e o expõe em `conn.assigns.frappe_ui_theme`
para o layout raiz: `<html data-theme={@frappe_ui_theme}>`.
- [FrappeUIPhx.Texts](FrappeUIPhx.Texts.md): Textos fixos da biblioteca (rótulos de acessibilidade, mensagens auxiliares), em
português por padrão, **sobrescrevíveis sem copiar componentes**.
- [FrappeUIPhx.Toast](FrappeUIPhx.Toast.md): API de servidor para toasts (substitui `toast()` do Frappe UI).
- [FrappeUIPhx.ToastSink](FrappeUIPhx.ToastSink.md): Contrato de como um toast chega ao cliente. A implementação padrão
(`FrappeUIPhx.ToastSink.PushEvent`) usa `push_event/3`; troque via config
- [FrappeUIPhx.ToastSink.PushEvent](FrappeUIPhx.ToastSink.PushEvent.md): Entrega o toast ao hook `.Toast` pelo evento `frappe-ui:toast`.
- [FrappeUIPhx.Translator](FrappeUIPhx.Translator.md): Contrato para traduzir os textos fixos da biblioteca.

## Mix Tasks

- [mix frappe_ui_phx.install](Mix.Tasks.FrappeUiPhx.Install.md): Configura o app Phoenix atual para usar a biblioteca. Idempotente: pode rodar
quantas vezes quiser.

