# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Development Commands

```bash
# Validate color usage (run before commits)
./scripts/validate-colors.sh

# Start local HTTP server (for viewing showcase)
python -m http.server 8000
# Then open: http://localhost:8000/showcase/

# Run the Next.js wrappers package (MVP)
cd ds-nextjs && npm install && npm run dev
# Then open: http://localhost:3100
```

## Architecture

O **core** do design system é estático e não tem build — é consumido via `<link>` por apps Flask/Jinja, showcase HTML e Oracle APEX. A exceção é o pacote `ds-nextjs/`, que tem build próprio via npm (Next.js 14 + Tailwind instalado). O core e o `ds-nextjs` compartilham a mesma fonte de verdade em `tokens/` — o Next importa esses arquivos via `postcss-import`, sem duplicação.

```
src/                    # SOURCE CODE (organized)
├── tokens/             # Core design tokens (colors, typography, spacing)
├── components/         # UI component styles
├── themes/             # Dark mode, density modes
└── js/                 # JavaScript utilities

docs/                   # DOCUMENTATION (consolidated)
├── patterns/           # Design patterns
├── components/         # Component docs
├── integrations/       # Integration guides
└── usando-next.js.md   # Guia completo do ds-nextjs (quando usar, migrações)

showcase/               # INTERACTIVE DEMOS
├── components/         # Component demos
├── examples/           # Full-page examples
└── shared/             # Tailwind config, utilities

integrations/           # INTEGRATION KITS
├── oracle-apex/        # Oracle APEX theme
└── tailwind-preset/    # Tailwind configuration (CDN format)

ds-nextjs/              # NEXT.JS WRAPPERS PACKAGE (MVP)
├── app/                # App Router + 3 demos (drops, skeleton, breadcrumb)
├── components/ds/      # Wrappers React tipados (Drop, Card, Skeleton*, BreadcrumbPharma)
├── components/         # theme-provider, theme-toggle
├── tailwind.config.ts  # Preset TypeScript espelhando integrations/tailwind-preset/
└── README.md           # Análise de viabilidade + instruções

tokens/                 # MAIN IMPORTS (backward compatible)
```

**Key principle**: All colors are CSS Custom Properties. Dark mode works automatically via `html.dark-mode` class that redefines variables. The same rule applies to the Next.js wrappers — they consume the CSS variables via `next-themes` configured to write `dark-mode` to `<html>`.

## Quando usar cada forma de consumo

O DS tem três formas de consumo, escolhidas pelo stack do app:

| Consumo | Quando usar | Ponto de entrada |
|---|---|---|
| **CSS puro + Tailwind CDN** | Showcase, protótipos HTML, apps Flask/Jinja legados, páginas estáticas | `<link href="tokens/index.css">` + `integrations/tailwind-preset/` |
| **Oracle APEX kit** | Telas de curadoria em APEX | `integrations/oracle-apex/` |
| **`ds-nextjs` (wrappers React)** | Novos apps Next.js, migrações de Flask+HTMX para React, qualquer coisa com SSR moderno | `import { Drop, Card, ... } from "@/components/ds"` — ver `docs/usando-next.js.md` |

Para entender **como pedir a migração ou criação de apps usando o `ds-nextjs`**, consulte `docs/usando-next.js.md` — cobre templates de prompt, três níveis de escopo para migração, e guia específico para converter apps Flask+HTMX em Next.js.

## Paridade de presets Tailwind

Existem dois presets Tailwind quase idênticos no repositório, cada um servindo a um stack diferente:

- `integrations/tailwind-preset/tailwind.config.js` — formato CDN (mutação de `tailwind.config` global), usado pelo showcase e por apps HTML
- `ds-nextjs/tailwind.config.ts` — formato módulo ESM com tipos, usado pelo Next.js

**Ao editar um preset, atualize ambos os arquivos.** Se o drift começar a dar problema, extrair um preset TypeScript compartilhado e fazer o arquivo CDN gerá-lo via script. Tarefa futura.

---

# PharmData Design System - Diretrizes para IA

> **IMPORTANTE**: Este arquivo contém instruções obrigatórias para qualquer IA que trabalhe neste projeto.
> Leia completamente antes de fazer qualquer modificação em arquivos CSS ou HTML.

---

## Contexto do Projeto

O PharmData Design System é um sistema de design para aplicações de curadoria de dados farmacêuticos. Utiliza:

- **CSS Custom Properties** como fonte única de verdade para cores
- **Tailwind CSS via CDN** para prototipagem HTML e Tailwind instalado via npm para Next.js
- **Dark mode** via classe `html.dark-mode` que redefine variáveis
- **Wrappers React** (opcional) via pacote `ds-nextjs/` para apps Next.js

### Arquitetura de Arquivos

```
design-system/
├── src/                    # Código fonte organizado
│   ├── tokens/             # Design tokens (cores, tipografia)
│   ├── components/         # Estilos de componentes
│   └── themes/             # Dark mode, density
├── tokens/                 # Imports principais (retrocompat)
│   └── colors.css          # FONTE ÚNICA de cores e dark mode
├── assets/                 # Assets estáticos
│   └── icons/health/       # Biblioteca de 316 ícones de saúde em 10 categorias RPDA
│                           # (outline + filled, base Health Icons + ~70 originais PharmData)
├── docs/                   # Documentação consolidada
│   └── usando-next.js.md   # Guia completo de consumo via Next.js + templates de prompt
├── showcase/               # Demos interativas
│   ├── components/
│   │   └── health-icons-showcase.html  # Navegador visual dos ícones de saúde
│   └── shared/
│       ├── tailwind-config.js
│       └── dark-mode-base.css
├── ds-nextjs/              # Pacote Next.js 14 com wrappers React (MVP)
│   ├── app/                # App Router + 3 demos
│   ├── components/ds/      # Wrappers tipados (Drop, Card, Skeleton*, BreadcrumbPharma)
│   └── tailwind.config.ts  # Preset TypeScript (manter em paridade com integrations/)
├── integrations/           # Kits Oracle APEX, Tailwind
└── scripts/
    └── validate-colors.sh
```

### Biblioteca de ícones de saúde

Em `assets/icons/health/` há **316 ícones SVG em 10 categorias RPDA** (632 arquivos contando outline + filled):

| Categoria | Qtd | Exemplos |
|---|---|---|
| `formas-farmaceuticas/` | 44 | comprimido, cápsula, ampola, frasco |
| `vias-administracao/` | 21 | oral, intravenosa, subcutânea, tópica |
| `modos-administracao/` | 18 | gotejamento, injeção, inalação |
| `administracao/` | 23 | bomba infusora, monitor, desfibrilador |
| `dispensacao/` | 22 | receita, balcão, estoque |
| `regulatorio/` | 50 | registro, tarja, controle especial |
| `condicoes/` | 44 | diabetes, hipertensão, dor |
| `corpo/` | 42 | órgãos, sistemas anatômicos |
| `especialidades/` | 27 | cardiologia, oncologia, pediatria |
| `pessoas/` | 25 | médico, farmacêutico, paciente |

Base curada do **Health Icons (MIT)** mais ~70 originais PharmData, redesenhados em stroke outline 1.5 px. Cada ícone tem variante `outline` (padrão) e `filled` (subpasta `filled/`). Ver showcase interativo em `showcase/components/health-icons-showcase.html`.

**Regra de uso:** para ícones genéricos de UI (setas, checks, menus, ícones dos drops), continue usando Font Awesome como o resto do DS. Para ícones específicos de saúde/farmácia/RPDA, prefira a biblioteca em `assets/icons/health/`.

---

## REGRAS OBRIGATÓRIAS

### 1. NUNCA usar cores hardcoded

```css
/* ❌ PROIBIDO */
background: white;
background: #fff;
background: #ffffff;
background-color: white;
color: #333;
border-color: #e5e7eb;

/* ✅ CORRETO */
background: var(--cloud);
background: var(--arctic-mist);
color: var(--graphite-depth);
border-color: var(--soft-arctic);
```

### 2. NUNCA usar classes Tailwind built-in para cores

```html
<!-- ❌ PROIBIDO -->
<div class="bg-white">
<div class="bg-gray-50">
<div class="bg-gray-100">
<div class="text-gray-900">
<div class="text-gray-600">
<div class="border-gray-200">

<!-- ✅ CORRETO -->
<div class="bg-cloud">
<div class="bg-arctic-mist">
<div class="bg-surface">
<div class="text-graphite-depth">
<div class="text-soft-steel">
<div class="border-soft-arctic">
```

### 3. SEMPRE usar variáveis semânticas

| Propósito | Variável CSS | Classe Tailwind |
|-----------|-------------|-----------------|
| Background principal | `var(--cloud)` | `bg-cloud` ou `bg-surface` |
| Background elevado | `var(--arctic-mist)` | `bg-arctic-mist` ou `bg-surface-muted` |
| Texto principal | `var(--graphite-depth)` | `text-graphite-depth` |
| Texto secundário | `var(--soft-steel)` | `text-soft-steel` |
| Bordas | `var(--soft-arctic)` | `border-soft-arctic` |
| Accent/Links | `var(--teal-intense)` | `text-teal-intense` |
| Brand | `var(--emerald-abyss)` | `bg-emerald-abyss` |

### 4. Dark mode é AUTOMÁTICO

Quando você usa variáveis CSS, o dark mode funciona automaticamente:

```css
/* As variáveis são redefinidas em html.dark-mode */
:root {
    --cloud: #F5F8FA;  /* Light mode */
}

html.dark-mode {
    --cloud: #0d1117;  /* Dark mode */
}

/* Seu código usa a variável - funciona em ambos os modos */
.meu-componente {
    background: var(--cloud);  /* Automaticamente adapta! */
}
```

**NUNCA crie overrides manuais para dark mode** como:
```css
/* ❌ PROIBIDO - Não faça isso! */
html.dark-mode .meu-componente {
    background: #161b22 !important;
}
```

### 5. Wrappers React em `ds-nextjs/` são cascas finas

A regra "NUNCA criar CSS personalizado que o DS já cubra" vale também para componentes React no pacote `ds-nextjs/`. Wrappers React **apenas** compõem `className` sobre classes do DS — nunca definem estilos próprios.

```tsx
// ❌ PROIBIDO
export function Drop({ variant }) {
  return <span style={{ background: "#fff", padding: 8 }}>...</span>;
}

export function Drop({ variant }) {
  return <span className="custom-drop">...</span>;  // classe inventada
}

// ✅ CORRETO
export function Drop({ variant, shape = "pill", size = "sm" }) {
  const classes = ["drop", `drop-${variant}`, `drop-${shape}`, `drop-${size}`].join(" ");
  return <span className={classes}>...</span>;
}
```

Se um componente precisa de estilo que o DS não cobre, **adicione no DS primeiro** (em `tokens/` ou `src/components/`) e só então crie o wrapper React. Nunca improvise CSS dentro do `ds-nextjs/`.

---

## Mapeamento de Cores

### Cores de Background

| Uso | Variável | Light | Dark |
|-----|----------|-------|------|
| Página/Container | `--cloud` | #F5F8FA | #0d1117 |
| Cards/Modais | `--arctic-mist` | #E9ECEF | #161b22 |
| Áreas sutis | `--soft-arctic` | #E5E8EB | #21262d |

### Cores de Texto

| Uso | Variável | Light | Dark |
|-----|----------|-------|------|
| Texto principal | `--graphite-depth` | #1F2937 | #f0f6fc |
| Texto secundário | `--soft-steel` | #374151 | #b1bac4 |

### Cores de Accent

| Uso | Variável | Light | Dark |
|-----|----------|-------|------|
| Links/CTAs | `--teal-intense` | #1a8b7d | #3dc9bd |
| Hover | `--emerald-abyss` | #0B2D2A | #7ee2d0 |
| Highlights | `--mint-signal` | #B7E4D5 | #1a3d3a |

> **Nota**: `--teal-intense` foi ajustado de #2AA198 para #1a8b7d para melhorar contraste (WCAG AA 4.6:1)

### Cores de Status

| Status | Variável | Uso |
|--------|----------|-----|
| Sucesso | `--success` | Confirmações, aprovações |
| Aviso | `--warning` | Alertas, pendências |
| Erro | `--error` | Erros, rejeições |
| Info | `--info` | Informações neutras |

---

## Checklist Antes de Commitar

Antes de qualquer commit que modifique arquivos `.css`, `.html`, `.tsx` ou `.ts`:

- [ ] Nenhum `background: white` ou `background: #fff`
- [ ] Nenhum `bg-white`, `bg-gray-*`, `text-gray-*`, `border-gray-*`
- [ ] Todas as cores usam `var(--nome-variavel)` ou classes Tailwind do preset
- [ ] Nenhum override `!important` para dark mode
- [ ] Testado visualmente em light E dark mode
- [ ] Wrappers React em `ds-nextjs/components/ds/` são cascas finas sobre classes do DS — não definem estilos próprios, `style={{}}`, nem cores inline
- [ ] Se editou algo em `tokens/`, o `ds-nextjs` ainda compila (`cd ds-nextjs && npm run build`)
- [ ] Se editou um preset Tailwind (`integrations/tailwind-preset/tailwind.config.js` **ou** `ds-nextjs/tailwind.config.ts`), atualizou o outro para manter paridade

### Validação Automática

Execute antes de commitar:

```bash
./scripts/validate-colors.sh
```

O pre-commit hook também executa automaticamente e **bloqueia commits com violações**.

---

## Exemplos de Componentes Corretos

### Card

```html
<div class="bg-cloud border border-soft-arctic rounded-xl p-6 shadow-md">
    <h3 class="text-graphite-depth font-semibold">Título</h3>
    <p class="text-soft-steel">Descrição do card</p>
    <button class="bg-teal-intense text-white px-4 py-2 rounded-lg">
        Ação
    </button>
</div>
```

### Formulário

```html
<div class="form-group">
    <label class="form-label">Campo</label>
    <input type="text" class="form-input" placeholder="Digite aqui">
</div>
```

### Tabela

```html
<table class="ds-table">
    <thead>
        <tr><th>Coluna</th></tr>
    </thead>
    <tbody>
        <tr><td>Valor</td></tr>
    </tbody>
</table>
```

---

## O Que Mudou (Dezembro 2024)

### Migração Realizada

1. **119 ocorrências** de `bg-white` → `bg-cloud`
2. **52 ocorrências** de `background: white` → `var(--cloud)`
3. **~80 ocorrências** de `text-gray-*` → `text-graphite/text-soft-steel`
4. **392 → 190 linhas** em `dark-mode-base.css` (removidos overrides)

### Novos Arquivos

- `scripts/validate-colors.sh` - Validação automática
- `showcase/shared/utilities.css` - Classes utilitárias `.ds-*`
- `docs/ARCHITECTURE_ANALYSIS.md` - Documentação completa
- `.git/hooks/pre-commit` - Enforcement automático

### Novas Classes Tailwind

```javascript
// Semânticas (preferir estas)
'surface', 'surface-elevated', 'surface-muted'
'text-primary', 'text-secondary'
'border-default', 'border-subtle'
'accent', 'accent-hover'

// Status com variantes light
'success-light', 'warning-light', 'error-light', 'info-light'
```

---

## Resumo Executivo

> **A regra de ouro**: Se você está escrevendo uma cor, ela DEVE ser uma variável CSS (`var(--nome)`) ou uma classe Tailwind que mapeia para uma variável (`bg-cloud`, não `bg-white`).

Se seguir esta regra, o dark mode funcionará automaticamente e o sistema permanecerá consistente.

---

## Skeleton Loaders

Para estados de carregamento, use os skeleton loaders em vez de spinners genéricos. Eles mostram a estrutura esperada do conteúdo.

### Classes Disponíveis

| Classe | Uso |
|--------|-----|
| `.skeleton-line` | Linhas de texto |
| `.skeleton-circle` | Avatares, ícones |
| `.skeleton-badge` / `.skeleton-drop` | Tags, drops farmacêuticos |
| `.skeleton-avatar` | Avatares de usuário |
| `.skeleton-button` | Botões |
| `.skeleton-input` | Campos de formulário |
| `.skeleton-card` | Cards genéricos |

### Tamanhos

```html
<!-- Largura -->
<div class="skeleton-line skeleton-w-sm"></div>   <!-- 4rem -->
<div class="skeleton-line skeleton-w-md"></div>   <!-- 8rem -->
<div class="skeleton-line skeleton-w-lg"></div>   <!-- 12rem -->
<div class="skeleton-line skeleton-w-full"></div> <!-- 100% -->

<!-- Altura -->
<div class="skeleton-line skeleton-h-sm"></div>   <!-- 0.75rem -->
<div class="skeleton-line skeleton-h-md"></div>   <!-- 1rem -->
<div class="skeleton-line skeleton-h-lg"></div>   <!-- 1.5rem -->
```

### Componentes PharmData

```html
<!-- Card de Substância -->
<div class="skeleton-substance-card">
    <div class="skeleton-line skeleton-title"></div>
    <div class="skeleton-line skeleton-subtitle"></div>
    <div class="skeleton-drops">
        <span class="skeleton-drop"></span>
        <span class="skeleton-drop"></span>
    </div>
</div>

<!-- Card de Enrichment -->
<div class="skeleton-enrichment-card">
    <div class="skeleton-header">
        <span class="skeleton-line skeleton-w-sm"></span>
    </div>
    <div class="skeleton-body">
        <div class="skeleton-row">
            <span class="skeleton-line skeleton-label"></span>
            <span class="skeleton-line skeleton-value"></span>
        </div>
    </div>
</div>
```

### Animações

- **Shimmer** (padrão): Efeito de brilho que passa da esquerda para direita
- **Pulse**: Opacidade que pulsa suavemente - use `.skeleton-pulse`
- **Stagger**: Atraso sequencial em listas - use `.skeleton-stagger` no container

### Acessibilidade

O skeleton respeita `prefers-reduced-motion` automaticamente, trocando shimmer por pulse suave.

### Showcase

Veja exemplos interativos em: `showcase/components/skeleton-showcase.html`

---

## Drops com Ícones (Font Awesome)

Os drops possuem ícones Font Awesome automáticos via `::before`. **NUNCA use emojis**.

### Dependência

```html
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
```

### Ícones por Categoria

| Categoria | Classe | Ícone FA |
|-----------|--------|----------|
| Denominações Comerciais | `.drop-dec` | fa-pills |
| Substâncias Ativas | `.drop-sub` | fa-dna |
| Laboratórios | `.drop-lab` | fa-industry |
| Concentrações | `.drop-cnc` | fa-flask |
| Gotas | `.drop-gts` | fa-droplet |
| Formas Farmacêuticas | `.drop-fofa` | fa-syringe |
| Formas de Apresentação | `.drop-fap` | fa-box-open |
| Vias de Administração | `.drop-via` | fa-stethoscope |
| Embalagens | `.drop-emb` | fa-boxes-stacked |

### Controle de Ícones

```html
<!-- Com ícone (padrão) -->
<span class="drop drop-sub drop-pill drop-sm">Substância</span>

<!-- Sem ícone -->
<span class="drop drop-sub drop-pill drop-sm drop-no-icon">Substância</span>

<!-- Apenas ícone -->
<span class="drop drop-sub drop-circle drop-icon-only"></span>
```

---

## Modo Compacto (Power Users)

Para interfaces densas com muitos dados, use o modo compacto.

### Ativação

```html
<!-- Via classe no HTML -->
<html class="density-compact">

<!-- Via data attribute em container -->
<div data-density="compact">
    <!-- Conteúdo com densidade compacta -->
</div>
```

### Modos Disponíveis

| Modo | Classe/Atributo | Escala | Uso |
|------|-----------------|--------|-----|
| Default | (nenhum) | 1.0 | Padrão, boa legibilidade |
| Compact | `.density-compact` | 0.85 | Power users, muitos dados |
| Comfortable | `.density-comfortable` | 1.15 | Touch, acessibilidade |

### Toggle de Densidade

```html
<div class="density-toggle">
    <button class="density-toggle-btn" data-density="compact">Compacto</button>
    <button class="density-toggle-btn active" data-density="default">Padrão</button>
    <button class="density-toggle-btn" data-density="comfortable">Confortável</button>
</div>
```

---

## Atalhos de Teclado

### Estilos para Teclas

```html
<kbd>A</kbd> para aprovar
<kbd>Ctrl</kbd> + <kbd>S</kbd> para salvar
```

### Indicador de Atalho em Botões

```html
<button class="btn-approve has-shortcut" data-shortcut="A">
    Aprovar
</button>
```

### Barra de Ações de Workflow

```html
<div class="workflow-actions sticky">
    <div class="workflow-actions-left">
        <span class="workflow-counter"><strong>3</strong> de 25</span>
    </div>
    <div class="workflow-actions-center">
        <button class="btn btn-prev has-shortcut" data-shortcut="←">Anterior</button>
        <button class="btn btn-next has-shortcut" data-shortcut="→">Próximo</button>
    </div>
    <div class="workflow-actions-right">
        <button class="btn btn-reject has-shortcut" data-shortcut="R">Rejeitar</button>
        <button class="btn btn-approve has-shortcut" data-shortcut="A">Aprovar</button>
    </div>
</div>
```

### Atalhos Padrão Sugeridos

| Ação | Atalho |
|------|--------|
| Aprovar | `A` |
| Rejeitar | `R` |
| Próximo | `N` ou `→` |
| Anterior | `P` ou `←` |
| Editar | `E` |
| Salvar | `Ctrl+S` |
| Cancelar | `Esc` |

---

## Breadcrumb Farmacêutico

Navegação hierárquica para a estrutura: **Composições → Formulações → Embalagens → Apresentações**

### Uso Básico

```html
<nav aria-label="Hierarquia farmacêutica">
    <ul class="breadcrumb-pharma">
        <li class="breadcrumb-pharma-item" data-level="composicoes">
            <a href="#" class="breadcrumb-pharma-link">
                <i class="fa-solid fa-dna breadcrumb-pharma-icon"></i>
                <span class="breadcrumb-pharma-text">Composições</span>
                <span class="breadcrumb-pharma-count">12</span>
            </a>
        </li>
        <li class="breadcrumb-pharma-item active" data-level="formulacoes">
            <a href="#" class="breadcrumb-pharma-link">
                <i class="fa-solid fa-syringe breadcrumb-pharma-icon"></i>
                <span class="breadcrumb-pharma-text">Formulações</span>
            </a>
        </li>
        <li class="breadcrumb-pharma-item" data-level="embalagens">
            <a href="#" class="breadcrumb-pharma-link">
                <i class="fa-solid fa-boxes-stacked breadcrumb-pharma-icon"></i>
                <span class="breadcrumb-pharma-text">Embalagens</span>
            </a>
        </li>
        <li class="breadcrumb-pharma-item" data-level="apresentacoes">
            <a href="#" class="breadcrumb-pharma-link">
                <i class="fa-solid fa-pills breadcrumb-pharma-icon"></i>
                <span class="breadcrumb-pharma-text">Apresentações</span>
            </a>
        </li>
    </ul>
</nav>
```

### Variantes

| Classe | Descrição |
|--------|-----------|
| `.breadcrumb-pharma` | Horizontal com setas coloridas |
| `.breadcrumb-pharma-compact` | Versão menor |
| `.breadcrumb-pharma-vertical` | Layout vertical para sidebars |

### Níveis e Cores

Cada nível usa cores do sistema de drops:
- `composicoes` → azul (--drop-sub)
- `formulacoes` → roxo (--drop-fofa)
- `embalagens` → índigo (--drop-emb)
- `apresentacoes` → rosa (--drop-dec)

---

## Arquivos de Token Adicionados

| Arquivo | Descrição |
|---------|-----------|
| `tokens/skeleton.css` | Skeleton loaders para loading states |
| `tokens/density.css` | Modos de densidade (compact/comfortable) |
| `tokens/keyboard-shortcuts.css` | Estilos para atalhos e workflow |

---

*Última atualização: 2026-04-12 — adição do pacote `ds-nextjs/` (wrappers React MVP), biblioteca de ícones de saúde, guia `docs/usando-next.js.md`.*
*PharmData Design System v3.2.0*
