create-sdd-ai-stack 0.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +164 -0
- package/APP-STACK.md +31 -0
- package/APP.md +46 -0
- package/ARCHITECTURE.md +115 -0
- package/DESIGN.md +219 -0
- package/LICENSE +21 -0
- package/NEXT.md +345 -0
- package/NODE.md +107 -0
- package/REACT.md +92 -0
- package/README.md +260 -0
- package/SKILLS/check-docs/SKILL.md +24 -0
- package/SKILLS/check-docs/check-docs.mjs +56 -0
- package/SKILLS/create-feature/SKILL.md +40 -0
- package/SKILLS/create-feature/create-feature.mjs +128 -0
- package/SKILLS/create-feature.sh +112 -0
- package/SKILLS/install-submodule/SKILL.md +42 -0
- package/SKILLS/install-submodule/install-submodule.mjs +119 -0
- package/bin/create-sdd-ai-stack.mjs +93 -0
- package/docs/CHANGELOG.md +209 -0
- package/docs/PLANNING.md +68 -0
- package/docs/PRODUCT.md +76 -0
- package/docs/RELEASE.md +332 -0
- package/lib/check-links.mjs +42 -0
- package/lib/constants.mjs +60 -0
- package/lib/scaffold.mjs +253 -0
- package/package.json +80 -0
- package/specs/BACKLOG.md +24 -0
- package/specs/PLAN.md +57 -0
- package/specs/ROADMAP.md +35 -0
- package/specs/history/phases/phase-0-bootstrap.md +67 -0
- package/specs/tasks/TASK_TEMPLATE.md +46 -0
- package/src/cli.mjs +119 -0
- package/stacks/README.md +33 -0
- package/stacks/ai.md +52 -0
- package/stacks/ci.md +59 -0
- package/stacks/database.md +56 -0
- package/stacks/git.md +51 -0
- package/stacks/shadcn.md +52 -0
- package/stacks/tailwind.md +65 -0
- package/stacks/testing.md +74 -0
- package/stacks/typescript.md +58 -0
- package/template/next/.env.example +4 -0
- package/template/next/README.md +47 -0
- package/template/next/biome.json +36 -0
- package/template/next/gitignore +32 -0
- package/template/next/next.config.ts +12 -0
- package/template/next/package.json +47 -0
- package/template/next/playwright.config.ts +21 -0
- package/template/next/postcss.config.mjs +7 -0
- package/template/next/src/app/(app)/app/page.tsx +18 -0
- package/template/next/src/app/(app)/error.tsx +30 -0
- package/template/next/src/app/(app)/layout.tsx +25 -0
- package/template/next/src/app/(marketing)/page.tsx +73 -0
- package/template/next/src/app/globals.css +437 -0
- package/template/next/src/app/layout.tsx +41 -0
- package/template/next/src/app/not-found.tsx +11 -0
- package/template/next/src/features/example/actions.ts +43 -0
- package/template/next/src/features/example/application/create-example.usecase.ts +26 -0
- package/template/next/src/features/example/container.ts +16 -0
- package/template/next/src/features/example/domain/IExampleRepository.ts +11 -0
- package/template/next/src/features/example/domain/example.schema.ts +18 -0
- package/template/next/src/features/example/infrastructure/example.repository.ts +26 -0
- package/template/next/src/features/example/ui/create-example-form.tsx +56 -0
- package/template/next/src/proxy.ts +23 -0
- package/template/next/src/shared/lib/cn.ts +6 -0
- package/template/next/src/shared/server/auth.ts +32 -0
- package/template/next/src/shared/server/env.ts +14 -0
- package/template/next/src/shared/ui/index.ts +3 -0
- package/template/next/tests/e2e/routes.spec.ts +34 -0
- package/template/next/tests/unit/create-example.test.ts +55 -0
- package/template/next/tsconfig.json +37 -0
- package/template/next/vitest.config.ts +19 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# 🤖 LEIS ABSOLUTAS DO AGENTE IA (AGENTS.md)
|
|
2
|
+
|
|
3
|
+
> 🛑 **VOCÊ É UM AGENTE AUTÔNOMO** sob Spec-Driven Development (SDD).
|
|
4
|
+
> Sua memória falha em contexto longo. **Sua ÚNICA fonte da verdade são os arquivos de especificação deste repositório.** Se está aqui, vale. Se não está, não invente.
|
|
5
|
+
|
|
6
|
+
> 📦 **Onde este arquivo mora:** na raiz do pacote `create-sdd-ai-stack`.
|
|
7
|
+
> Quando instalado num projeto, ele fica em **`SDD/AGENTS.md`** e todos os caminhos abaixo são relativos a `SDD/`.
|
|
8
|
+
> Por isso todos os links usam prefixo `SDD/`.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 🎯 0. RESUMO EXECUTIVO (30 segundos)
|
|
13
|
+
|
|
14
|
+
| Pergunta | Resposta |
|
|
15
|
+
| --- | --- |
|
|
16
|
+
| Stack padrão? | **Next.js 16** (App Router) |
|
|
17
|
+
| Backend extra? | **Node.js** puro, só para worker/cron/webhook |
|
|
18
|
+
| Onde eu leio as regras? | `SDD/` — comece por `SDD/AGENTS.md` (este arquivo) |
|
|
19
|
+
| O que eu faço primeiro? | Ler `SDD/specs/PLAN.md` e pegar a **única** task `[-]` |
|
|
20
|
+
| Quando paro? | Quando a task virar `[x]` e eu colar a evidência do terminal |
|
|
21
|
+
| Posso editar regras? | **NÃO.** Ver [§6](#-6-regra-de-permissão-de-docs) |
|
|
22
|
+
| Como commito? | Conventional Commits + identidade fixa. Ver `SDD/stacks/git.md` |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 📚 1. MAPEAMENTO DE CONTEXTO (ordem obrigatória de leitura)
|
|
27
|
+
|
|
28
|
+
Sempre que for acionado, leia nesta exata ordem:
|
|
29
|
+
|
|
30
|
+
1. **`SDD/AGENTS.md`** (este arquivo) — leis e fluxo.
|
|
31
|
+
2. **`SDD/specs/PLAN.md`** — a **única** tarefa pendente agora.
|
|
32
|
+
3. **`SDD/APP.md`** + **`SDD/APP-STACK.md`** — o que é este app e qual a stack dele.
|
|
33
|
+
4. **`SDD/ARCHITECTURE.md`** — arquitetura global.
|
|
34
|
+
5. **`SDD/NEXT.md`** — regras da stack padrão (ou o doc da stack deste app, se `APP-STACK.md` apontar outro).
|
|
35
|
+
6. **`SDD/DESIGN.md`** — regras de UI/UX (só se for mexer em UI).
|
|
36
|
+
7. **`SDD/stacks/README.md`** — índice das regras por ferramenta (só se precisar).
|
|
37
|
+
|
|
38
|
+
> ⚠️ **Regra de hiperfoco (TDAH):** leia **o mínimo necessário**. Não leia tudo "por garantia". Abra o doc da stack só quando a task exigir.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 🗺️ 2. ROTEADOR DE REGRAS (onde está o quê)
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
SDD/
|
|
46
|
+
├── AGENTS.md ← VOCÊ ESTÁ AQUI (leis + fluxo)
|
|
47
|
+
├── APP.md ← o que é este app (regras de negócio)
|
|
48
|
+
├── APP-STACK.md ← qual stack este app usa (ponteiro)
|
|
49
|
+
├── ARCHITECTURE.md ← arquitetura global (vertical slices)
|
|
50
|
+
├── DESIGN.md ← design system (tokens, tipografia, componentes)
|
|
51
|
+
├── NEXT.md ← Next.js 16 ⭐ STACK PADRÃO
|
|
52
|
+
├── NODE.md ← Node.js puro (worker, cron, fila)
|
|
53
|
+
├── REACT.md ← React (hooks, estado, composição)
|
|
54
|
+
├── stacks/ ← regras por linguagem/ferramenta
|
|
55
|
+
│ ├── typescript.md tailwind.md shadcn.md testing.md
|
|
56
|
+
│ └── database.md ai.md git.md ci.md
|
|
57
|
+
├── specs/ ← SDD operacional
|
|
58
|
+
│ ├── PLAN.md (a task AGORA)
|
|
59
|
+
│ ├── BACKLOG.md (ideias soltas, débito técnico)
|
|
60
|
+
│ ├── ROADMAP.md (visão macro)
|
|
61
|
+
│ ├── history/phases/ (fases concluídas)
|
|
62
|
+
│ └── tasks/ (TASK-PHASE-TASK.md)
|
|
63
|
+
├── docs/
|
|
64
|
+
│ ├── PRODUCT.md changelog PLANNING.md
|
|
65
|
+
└── SKILLS/ ← automações (scripts) do projeto
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
| Preciso saber... | Abra |
|
|
69
|
+
| --------------------------- | ----------------------------- |
|
|
70
|
+
| A próxima task | `specs/PLAN.md` |
|
|
71
|
+
| As regras do Next.js | `NEXT.md` |
|
|
72
|
+
| Tokens de cor/fonte | `DESIGN.md` |
|
|
73
|
+
| Como commitar | `stacks/git.md` |
|
|
74
|
+
| Como escrever teste | `stacks/testing.md` |
|
|
75
|
+
| Regras de TypeScript | `stacks/typescript.md` |
|
|
76
|
+
| Estrutura de pasta | `ARCHITECTURE.md` |
|
|
77
|
+
| Qual stack este app usa | `APP-STACK.md` |
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 🧠 3. COMPORTAMENTO OBRIGATÓRIO
|
|
82
|
+
|
|
83
|
+
1. **Proativo e criativo, mas disciplinado.** Sugira melhoria de arquitetura, mas **pergunte antes** de alterar regra.
|
|
84
|
+
2. **Fim de ciclo = comemorar e perguntar.** Ao concluir uma fase: comemore, pergunte ao humano se segue, ou sugira o próximo desafio.
|
|
85
|
+
3. **Não invente regra.** Se a resposta não está em `SDD/`, **pergunte**. Nunca "improvisar" arquitetura.
|
|
86
|
+
4. **Falhou o teste? Pare.** Volte, corrija, rode de novo. **PROIBIDO avançar com teste vermelho.**
|
|
87
|
+
5. **Tamanho de task:** o dev tem TDAH. Se a task levar > 1h, **quebre em duas** antes de começar.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 🔄 4. FLUXO DE ENTREGA (o gated workflow)
|
|
92
|
+
|
|
93
|
+
Ao encontrar sua task em `specs/PLAN.md`:
|
|
94
|
+
|
|
95
|
+
1. **Refinar** — leia a task + o doc de regra relevante. Entenda 100% antes de escrever.
|
|
96
|
+
2. **Instalar pacotes** — **NUNCA** rode `npm install` na raiz. Use `cd` explícito se houver sub-pastas.
|
|
97
|
+
3. **Implementar** — só o necessário (máx 5 arquivos por passo). Use scripts de `SKILLS/` quando existirem.
|
|
98
|
+
4. **Testar** — `typecheck` + `test:unit` + `test:e2e`. Crie teste de TODO tipo: unit, integração, E2E. Mokar dados para teste rápido.
|
|
99
|
+
5. **Prova de vida anti-alucinação** — para marcar `[x]`, **cole o output verde do terminal** na resposta (comando + resultado + evidência Playwright). **Você está PROIBIDO de mentir sobre teste.**
|
|
100
|
+
6. **Concluir** — marque `[x]` em `specs/PLAN.md` e **encerre a resposta**.
|
|
101
|
+
|
|
102
|
+
### Loop de falha 🛑
|
|
103
|
+
> Erro? Volte. Corrija. Teste de novo. **Teste vermelho = task não concluída.** Sem exceção, sem "deve funcionar".
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 🛠️ 5. SISTEMA DE SKILLS (automação)
|
|
108
|
+
|
|
109
|
+
- Se um padrão se repete, **transforme em SKILL**: script em `SDD/SKILLS/<nome>/`.
|
|
110
|
+
- Antes de codar na mão, verifique se já existe uma SKILL que faz isso.
|
|
111
|
+
- Mantenha nomes descritivos para que **você mesmo** consiga descobrir e rodar.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 🌿 6. REGRA DE PERMISSÃO DE DOCS
|
|
116
|
+
|
|
117
|
+
| Ação | Permissão |
|
|
118
|
+
| --- | --- |
|
|
119
|
+
| Atualizar `specs/PLAN.md`, `specs/tasks/*`, `docs/changelog.md`, `docs/PRODUCT.md`, `docs/PLANNING.md` | ✅ **AUTOMÁTICO** (obrigatório após mudança) |
|
|
120
|
+
| Criar task nova em `specs/tasks/` | ✅ Automático quando a fase pedir |
|
|
121
|
+
| Editar `APP-STACK.md` para trocar a stack do app | ✅ Automático (é configuração do projeto) |
|
|
122
|
+
| **Editar** `NEXT.md`, `NODE.md`, `REACT.md`, `DESIGN.md`, `ARCHITECTURE.md`, `AGENTS.md`, `stacks/*` | 🛑 **PROIBIDO sem pedir** ao humano primeiro |
|
|
123
|
+
|
|
124
|
+
> Se identificar melhoria nessas arquiteturas, **PERGUNTE** antes de mudar. Elas são a lei do template.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 📝 7. GIT, COMMIT E VERSIONAMENTO
|
|
129
|
+
|
|
130
|
+
- **Gitflow + Conventional Commits + SemVer com tags.**
|
|
131
|
+
- **Identidade fixa:** Marcelino Sandroni <marcelino.sandroni@gmail.com>.
|
|
132
|
+
- **Padrão de mensagem:** `tipo(escopo): descrição curta. (Agent: <Ferramenta> - <Modelo>)`
|
|
133
|
+
- Ex.: `feat(chat): cria interface IVideo. (Agent: Cursor - Claude)`
|
|
134
|
+
- Tipos: `feat` `fix` `refactor` `test` `docs` `chore` `perf` `style` `build` `ci`.
|
|
135
|
+
- Detalhes completos: `stacks/git.md`.
|
|
136
|
+
|
|
137
|
+
### Limpeza de memória (fim de fase)
|
|
138
|
+
Quando **todas** as tasks da fase no `specs/PLAN.md` estiverem `[x]`:
|
|
139
|
+
1. Resuma a fase em `specs/history/phases/phase-N-finished.md`.
|
|
140
|
+
2. Apague as tasks concluídas de `specs/tasks/`.
|
|
141
|
+
3. Gere a tag SemVer: `git tag vX.Y.Z`.
|
|
142
|
+
4. **Um** commit de arquivamento.
|
|
143
|
+
5. Limpe o `specs/PLAN.md` e pergunte: **"Qual o próximo desafio, chefe?"**
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 🚨 8. ARMADILHAS CONHECIDAS (Next 16)
|
|
148
|
+
|
|
149
|
+
Não caia nestas (detalhes em `NEXT.md` §11):
|
|
150
|
+
- `params`/`searchParams`/`cookies()`/`headers()` são **async**.
|
|
151
|
+
- `middleware.ts` foi renomeado para **`proxy.ts`** (função `proxy`). Arquivo antigo é ignorado em silêncio.
|
|
152
|
+
- `revalidateTag(tag)` de 1 argumento **depreciado** → use `updateTag` em actions.
|
|
153
|
+
- `next lint` **removido** → use Biome/ESLint direto.
|
|
154
|
+
- `export const dynamic/revalidate` **não existem** com `cacheComponents` → use `'use cache'` + `cacheLife`.
|
|
155
|
+
- Turbopack é o **padrão** do build.
|
|
156
|
+
- Parallel routes exigem `default.js` explícito.
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 🧭 9. COMO ESTE PROJETO FOI MONTADO
|
|
161
|
+
|
|
162
|
+
- Este repositório é o **template** (`create-sdd-ai-stack`). As regras vivem em `SDD/`.
|
|
163
|
+
- Consumo: `npx create-sdd-ai-stack meu-app` (copia as regras + o template Next) **ou** `git submodule add ... SDD` (só as regras).
|
|
164
|
+
- Detalhes: [`README.md`](./README.md).
|
package/APP-STACK.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# 🧠 APP-STACK (qual stack este app usa)
|
|
2
|
+
|
|
3
|
+
> **Ponteiro de stack.** O agente lê o doc aqui e abre o arquivo de regras correspondente.
|
|
4
|
+
> Trocar este arquivo é **automático** (é configuração do projeto). Trocar as regras em si, **não**.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 🎯 Stack ativa
|
|
9
|
+
|
|
10
|
+
| Papel | Stack | Documento de regras |
|
|
11
|
+
| --- | --- | --- |
|
|
12
|
+
| **App (frontend + backend)** | **Next.js 16** — App Router | [NEXT.md](./NEXT.md) ⭐ **STACK PADRÃO** |
|
|
13
|
+
| **UI library** | shadcn/ui + Tailwind CSS v4 | [stacks/shadcn.md](./stacks/shadcn.md) · [stacks/tailwind.md](./stacks/tailwind.md) |
|
|
14
|
+
| **Linguagem** | TypeScript (strict) | [stacks/typescript.md](./stacks/typescript.md) |
|
|
15
|
+
| **Backend extra** | Node.js puro (workers, cron, filas) | [NODE.md](./NODE.md) |
|
|
16
|
+
| **Banco de dados** | Prisma ORM | [stacks/database.md](./stacks/database.md) |
|
|
17
|
+
| **Validação** | Zod | [stacks/typescript.md](./stacks/typescript.md) |
|
|
18
|
+
| **Testes** | Vitest + Playwright | [stacks/testing.md](./stacks/testing.md) |
|
|
19
|
+
| **IA / LLM** | (se o app usar) | [stacks/ai.md](./stacks/ai.md) |
|
|
20
|
+
| **Deploy** | Vercel | [stacks/ci.md](./stacks/ci.md) |
|
|
21
|
+
| **Versionamento** | Git + Conventional Commits | [stacks/git.md](./stacks/git.md) |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 🔀 Como trocar a stack do app
|
|
26
|
+
|
|
27
|
+
1. Edite a tabela acima com a stack real deste projeto.
|
|
28
|
+
2. Se usar uma stack que não tem doc aqui, crie `SDD/stacks/<stack>.md` seguindo o padrão dos outros.
|
|
29
|
+
3. **Não mexa** em `AGENTS.md` §1 (que aponta o doc padrão) sem pedir ao humano.
|
|
30
|
+
|
|
31
|
+
> Enquanto `APP-STACK.md` apontar para `NEXT.md`, a stack padrão do template é Next.js.
|
package/APP.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# 🚀 [NOME DO SEU APP AQUI]
|
|
2
|
+
|
|
3
|
+
> ⚠️ **FOCA AQUI:** Substitua esse bloco pela descrição real da aplicação. O que ela faz? Qual problema resolve? Quem é o usuário final? Direto ao ponto, sem enrolação.
|
|
4
|
+
|
|
5
|
+
## 🏗️ Stack e Arquitetura
|
|
6
|
+
|
|
7
|
+
Este projeto segue **Spec-Driven Development** com **Next.js 16** e **Vertical Slices**.
|
|
8
|
+
|
|
9
|
+
**Leia antes de tocar em uma linha de código:**
|
|
10
|
+
|
|
11
|
+
| Documento | Escopo |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| [🤖 AGENTS.md](./AGENTS.md) | **Leis do agente + fluxo de entrega (LEIA PRIMEIRO)** |
|
|
14
|
+
| [🎯 specs/PLAN.md](./specs/PLAN.md) | A task que está sendo feita AGORA |
|
|
15
|
+
| [🧠 APP-STACK.md](./APP-STACK.md) | Qual stack este app usa (ponteiro) |
|
|
16
|
+
| [⚛️ NEXT.md](./NEXT.md) | Regras do Next.js 16 — **stack padrão** |
|
|
17
|
+
| [🟢 NODE.md](./NODE.md) | Regras do Node.js puro (workers, cron, filas) |
|
|
18
|
+
| [⚛️ REACT.md](./REACT.md) | Regras do React |
|
|
19
|
+
| [🎨 DESIGN.md](./DESIGN.md) | Design system (tokens, tipografia, componentes) |
|
|
20
|
+
| [🏗️ ARCHITECTURE.md](./ARCHITECTURE.md) | Arquitetura global (vertical slices) |
|
|
21
|
+
| [🧱 stacks/](./stacks/README.md) | TypeScript, Tailwind, shadcn, testes, DB, IA, Git, CI |
|
|
22
|
+
|
|
23
|
+
## 🛠️ Stack Principal
|
|
24
|
+
|
|
25
|
+
- **App (fullstack):** Next.js 16 (App Router, Server Actions, Route Handlers)
|
|
26
|
+
- **UI:** React 19.2 (Server Components por padrão) + Tailwind v4 + shadcn/ui
|
|
27
|
+
- **Dados:** Prisma + [PostgreSQL / MySQL / SQLite]
|
|
28
|
+
- **Validação:** Zod
|
|
29
|
+
- **Testes:** Vitest (unit/integr) + Playwright (E2E)
|
|
30
|
+
- **Backend extra (se houver):** Node.js puro para worker/cron/fila
|
|
31
|
+
- **Deploy:** [Vercel / Node VPS / Railway]
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 📝 Detalhes Específicos do App
|
|
36
|
+
|
|
37
|
+
*(Escreva AQUI as regras de negócio únicas, integrações e fluxos que só este app tem. **Não deixe em branco**.)*
|
|
38
|
+
|
|
39
|
+
- **Integrações de Terceiros:** [Ex: OpenAI, Stripe, WhatsApp API]
|
|
40
|
+
- **Features Principais:**
|
|
41
|
+
- [Ex: Geração de vídeo por IA]
|
|
42
|
+
- [Ex: Dashboard de métricas executivas]
|
|
43
|
+
- **Regras Críticas de Negócio:**
|
|
44
|
+
- [Ex: O usuário só pode gerar 5 vídeos por dia na conta free]
|
|
45
|
+
- **Entidades de Domínio:** [Liste as entidades principais e suas invariantes]
|
|
46
|
+
- **Regras de Autorização:** [Ex: Admin vê tudo; membro só o próprio workspace]
|
package/ARCHITECTURE.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# 🏗️ ARQUITETURA GLOBAL
|
|
2
|
+
|
|
3
|
+
> **Next.js 16, App Router, Vertical Slices.** Sem `client/` vs `server/` separado — o framework já é a fronteira.
|
|
4
|
+
|
|
5
|
+
## 🧠 O princípio
|
|
6
|
+
|
|
7
|
+
Uma **feature** (fatia vertical) é a unidade de mudança. Ela carrega **tudo** que aquele domínio precisa:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
src/features/chat/
|
|
11
|
+
├── domain/ # Entidades, contratos (I*.ts) — ZERO dependência externa
|
|
12
|
+
├── application/ # Use cases (lógica de negócio pura)
|
|
13
|
+
├── infrastructure/ # Prisma, HTTP client, filas, storage
|
|
14
|
+
├── container.ts # Montagem de dependências (DI do slice)
|
|
15
|
+
├── queries.ts # Entrada de LEITURA
|
|
16
|
+
├── actions.ts # Entrada de ESCRITA (Server Actions)
|
|
17
|
+
└── ui/ # Componentes do domínio
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Consequência prática:** para entender um requisito, você abre **uma** pasta. Nada se espalha.
|
|
21
|
+
|
|
22
|
+
## 📂 Estrutura root
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
meu-projeto/
|
|
26
|
+
├── src/
|
|
27
|
+
│ ├── app/ # ROTEAMENTO (só roteia, zero regra de negócio)
|
|
28
|
+
│ ├── features/ # 🌟 SLICES DE DOMÍNIO
|
|
29
|
+
│ ├── shared/ # Genérico compartilhado
|
|
30
|
+
│ │ ├── ui/ # Design system (shadcn)
|
|
31
|
+
│ │ ├── lib/ # Helpers puros
|
|
32
|
+
│ │ ├── server/ # server-only: db, auth, env, logger
|
|
33
|
+
│ │ └── hooks/ # Hooks transversais
|
|
34
|
+
│ └── proxy.ts # Network boundary (opcional)
|
|
35
|
+
├── SDD/ # As regras (submodule) ← o que o agente lê
|
|
36
|
+
├── tests/ # unit/ integration/ e2e/
|
|
37
|
+
└── public/
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 🔀 Fluxo de uma requisição
|
|
41
|
+
|
|
42
|
+
```text
|
|
43
|
+
Browser
|
|
44
|
+
↓
|
|
45
|
+
proxy.ts (rede: redirect, rewrite) ← NÃO é segurança
|
|
46
|
+
↓
|
|
47
|
+
app/…/page.tsx (Server Component)
|
|
48
|
+
↓
|
|
49
|
+
features/x/queries.ts (leitura, com 'use cache' se cabível)
|
|
50
|
+
↓
|
|
51
|
+
features/x/application/ (use case)
|
|
52
|
+
↓
|
|
53
|
+
features/x/infrastructure/ (Prisma / API externa)
|
|
54
|
+
↓
|
|
55
|
+
render (PPR: shell estático + conteúdo dinâmico)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
```text
|
|
59
|
+
Browser <form action={…}>
|
|
60
|
+
↓
|
|
61
|
+
app/…/page.tsx (Server Action) — auth → zod → autorização → use case → cache
|
|
62
|
+
↓
|
|
63
|
+
revalidate / updateTag
|
|
64
|
+
↓
|
|
65
|
+
re-render do shell
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## 🧩 Shared vs Feature — a régua de decisão
|
|
69
|
+
|
|
70
|
+
| Pergunta | Resposta |
|
|
71
|
+
| ------------------------------------------ | ----------------------------------- |
|
|
72
|
+
| "Isso é genérico e não é de um domínio?" | `shared/` |
|
|
73
|
+
| "Só este domínio usa?" | `features/<dominio>/` |
|
|
74
|
+
| "Precisa de DB/rede/segredo?" | `infrastructure/` (ou `shared/server`) |
|
|
75
|
+
| "É UI primitiva (Button, Dialog)?" | `shared/ui/` |
|
|
76
|
+
| "É UI com regra de negócio?" | `features/<dominio>/ui/` |
|
|
77
|
+
|
|
78
|
+
**Proibido:** `features/a` importando `features/b`. Se precisar, extraia para `shared/` ou use evento de domínio.
|
|
79
|
+
|
|
80
|
+
## 📏 Onde cada tipo de código mora
|
|
81
|
+
|
|
82
|
+
| Tipo | Local | Por quê |
|
|
83
|
+
| --- | --- | --- |
|
|
84
|
+
| Regra de negócio | `features/x/application/` | Testável, isolada, sem Next |
|
|
85
|
+
| Contrato de domínio | `features/x/domain/` | Zero dependência (inverte a direção) |
|
|
86
|
+
| SQL / Prisma query | `features/x/infrastructure/` | Trocável sem tocar no domínio |
|
|
87
|
+
| Server Action | `features/x/actions.ts` | Entrada de escrita, com auth+validação |
|
|
88
|
+
| Query (leitura) | `features/x/queries.ts` | Entrada de leitura, com cache |
|
|
89
|
+
| Componente de rota | `app/…/page.tsx` | Só layout + composição |
|
|
90
|
+
| Config global (env, db, auth) | `shared/server/` | Ponto único de boot |
|
|
91
|
+
| Token de design | `app/globals.css` | Fonte única do tema |
|
|
92
|
+
|
|
93
|
+
## 🧪 Testabilidade
|
|
94
|
+
|
|
95
|
+
A arquitetura existe para isso: **`application/` e `domain/` não importam Next nem Prisma.** Você instancia o use case com um repositório falso e testa em 5ms.
|
|
96
|
+
|
|
97
|
+
```ts
|
|
98
|
+
const useCase = new CreateExampleUseCase(fakeRepo);
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 🚫 Anti-padrões estruturais
|
|
102
|
+
|
|
103
|
+
| ❌ | ✅ |
|
|
104
|
+
| --- | --- |
|
|
105
|
+
| `src/utils/`, `src/services/`, `src/models/` (pastas genéricas) | `features/<dominio>/` |
|
|
106
|
+
| Lógica de negócio em `page.tsx` | `page.tsx` delega para use case |
|
|
107
|
+
| `features/a` importando `features/b` | `shared/` ou evento |
|
|
108
|
+
| `types/` global com tipo de domínio | `I*.ts` dentro do slice |
|
|
109
|
+
| Prisma importado em Server Component | via `queries.ts` |
|
|
110
|
+
| CSS inline / hex literal | tokens do [DESIGN.md](./DESIGN.md) |
|
|
111
|
+
| API route para tudo | Server Action para mutação de UI |
|
|
112
|
+
|
|
113
|
+
## 🧭 Complementary: Node.js
|
|
114
|
+
|
|
115
|
+
O App Router cobre web. **Node.js puro** entra **só** para o que o App Router não faz: worker de fila, cron, consumer de webhook pesado, CLI de batch. Ver [NODE.md](./NODE.md).
|
package/DESIGN.md
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# 🎨 DESIGN SYSTEM — EXECUTIVE ENGINEERING
|
|
2
|
+
|
|
3
|
+
> **Esta é a lei visual do projeto.** Se a UI não segue este documento, a UI está errada.
|
|
4
|
+
> Tema: **DARK ONLY**. Sem modo claro. Sem branding genérico.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 🧭 0. ROTEADOR
|
|
9
|
+
|
|
10
|
+
| Você está fazendo... | Leia |
|
|
11
|
+
| --------------------------------- | ----------------- |
|
|
12
|
+
| Escolhendo cor/espaço/fonte | §1 Tokens |
|
|
13
|
+
| Escrevendo/copiando CSS | §2 Tokens |
|
|
14
|
+
| Montando layout/grid | §5 Layout |
|
|
15
|
+
| Botão, card, chip, input | §6 Componentes |
|
|
16
|
+
| Pensando em feedback/UX | §7 UX |
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 🎯 1. BRAND & STYLE
|
|
21
|
+
|
|
22
|
+
Interseção entre **engenharia de sistemas distribuídos de alto nível** e **stewardship financeiro executivo**.
|
|
23
|
+
|
|
24
|
+
- **Estética:** precisão de ferramenta de dev (Linear, Vercel) + disciplina tipográfica de publicação suíça e whitepapers financeiros (Stripe Press).
|
|
25
|
+
- **Tom emocional:** execução de alta frequência somada a gravidade institucional. Calculado, calmo, inabalável.
|
|
26
|
+
- **Tratamento visual:** austero, denso, mas impecavelmente legível.
|
|
27
|
+
- **Surfaces:** ardósia profunda com tom obsidiana (nunca preto absoluto), micro-bordas de 1px, acentos surgical em neon lime e mint.
|
|
28
|
+
- **Métricas de impacto financeiro** (R$ milhões salvos, latências, bilhões sob custódia) têm peso tipográfico de museu.
|
|
29
|
+
- **Zero firula.** Estímulo visual além do necessário = falha.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 🎨 2. TOKENS (FONTE DE VERDADE)
|
|
34
|
+
|
|
35
|
+
> Tokens vivem em `src/app/globals.css` dentro do bloco `@theme` (Tailwind v4).
|
|
36
|
+
> **Nunca** escreva hex literal em componente.
|
|
37
|
+
|
|
38
|
+
### Cores
|
|
39
|
+
|
|
40
|
+
| Token | Hex | Uso |
|
|
41
|
+
| --- | --- | --- |
|
|
42
|
+
| `surface` | `#111319` | Base de panels/cards |
|
|
43
|
+
| `surface-base` | `#0A0D12` | Canvas raiz (Tier 0) |
|
|
44
|
+
| `surface-raised` | `#11151C` | Cards e containers (Tier 1) |
|
|
45
|
+
| `surface-overlay` | `#181E27` | Modais, dropdowns, code headers (Tier 2) |
|
|
46
|
+
| `surface-container` | `#1D2025` | Containers neutros |
|
|
47
|
+
| `surface-container-high` | `#272A30` | Containers elevados |
|
|
48
|
+
| `surface-container-highest` | `#32353B` | Máximo contraste de container |
|
|
49
|
+
| `surface-bright` | `#36393F` | Superfícies muito elevadas |
|
|
50
|
+
| `on-surface` | `#E1E2EA` | Texto/icons sobre surface |
|
|
51
|
+
| `text-primary` | `#F4F1EA` | Texto principal (off-white editorial quente) |
|
|
52
|
+
| `text-secondary` | `#94A3B8` | Texto subsequente |
|
|
53
|
+
| `text-muted` | `#56657A` | Texto terciário / decorativo |
|
|
54
|
+
| `border-subtle` | `#1E2633` | Borda de card (Tier 1) |
|
|
55
|
+
| `border-prominent` | `#2D384B` | Borda de overlay (Tier 2) |
|
|
56
|
+
| `primary` | `#BAF336` | 🟢 **Lime neon** — ação executiva crítica, ROI, estado ativo |
|
|
57
|
+
| `on-primary` | `#0A0D12` | Texto sobre lime |
|
|
58
|
+
| `primary-container` | `#B4F230` | Lime em container |
|
|
59
|
+
| `on-primary-container` | `#253600` | Texto sobre lime container |
|
|
60
|
+
| `secondary` | `#45DFA4` | 🟢 **Mint** — estabilidade, SLA up, delta positivo |
|
|
61
|
+
| `on-secondary` | `#003825` | Texto sobre mint |
|
|
62
|
+
| `tertiary` | `#9CC5FD` | 🔵 **Slate blue** — badges de infra, estágios de pipeline, tags técnicas |
|
|
63
|
+
| `on-tertiary` | `#003257` | Texto sobre tertiary |
|
|
64
|
+
| `error` | `#FFB4AB` | Erro |
|
|
65
|
+
| `on-error` | `#690005` | Texto sobre erro |
|
|
66
|
+
| `error-container` | `#93000A` | Erro em container |
|
|
67
|
+
| `outline` | `#8D937B` | Contorno/foco |
|
|
68
|
+
| `outline-variant` | `#434935` | Variante de contorno |
|
|
69
|
+
| `kpi-accent-glow` | `rgba(186,243,54,0.12)` | Glow de KPI lime |
|
|
70
|
+
| `mint-accent-glow` | `rgba(52,211,153,0.12)` | Glow de KPI mint |
|
|
71
|
+
|
|
72
|
+
> **Regra de acento:** APENAS 1 cor primária de sotaque por tela. Lime (`primary`) é a ação executiva. Mint (`secondary`) é status/positivo. Slate blue (`tertiary`) é taxonomy/infra. Nunca as três brigando.
|
|
73
|
+
|
|
74
|
+
### Tipografia — matriz de 3 fontes
|
|
75
|
+
|
|
76
|
+
| Família | Papel | Regra |
|
|
77
|
+
| --- | --- | --- |
|
|
78
|
+
| **Manrope** | Núcleo geométrico estrutural: headlines, body, números gigantes | Peso 400–800 |
|
|
79
|
+
| **JetBrains Mono** | Instrumentação técnica: tags, paths, índices, commit, metadata | `letter-spacing: 0.06em` em CAPS |
|
|
80
|
+
| **Playfair Display** | Nuance editorial financeira: quotes, framing estratégico | Só itálico/médio. sparingly. |
|
|
81
|
+
|
|
82
|
+
Todas via `next/font/google` (zero layout shift, zero request externo). Ver [stacks/tailwind.md](./stacks/tailwind.md).
|
|
83
|
+
|
|
84
|
+
#### Escala tipográfica
|
|
85
|
+
|
|
86
|
+
| Token | Fonte | Tamanho / Peso / Line | Letter | Uso |
|
|
87
|
+
| --- | --- | --- | --- | --- |
|
|
88
|
+
| `display-hero` | Manrope | 64 / 800 / 72 | -0.035em | Hero desktop |
|
|
89
|
+
| `display-hero-mobile` | Manrope | 38 / 800 / 44 | -0.025em | Hero mobile |
|
|
90
|
+
| `metric-stat` | Manrope | 48 / 700 / 52 | -0.03em | KPI desktop |
|
|
91
|
+
| `metric-stat-mobile` | Manrope | 32 / 700 / 36 | -0.02em | KPI mobile |
|
|
92
|
+
| `headline-lg` | Manrope | 32 / 700 / 40 | -0.02em | Título de seção |
|
|
93
|
+
| `headline-md` | Manrope | 24 / 600 / 32 | -0.015em | Título de card |
|
|
94
|
+
| `headline-sm` | Manrope | 18 / 600 / 26 | -0.01em | Subtítulo |
|
|
95
|
+
| `body-lg` | Manrope | 17 / 400 / 28 | — | Body principal |
|
|
96
|
+
| `body-md` | Manrope | 15 / 400 / 24 | — | Body padrão |
|
|
97
|
+
| `body-sm` | Manrope | 13 / 400 / 20 | — | Body denso |
|
|
98
|
+
| `editorial-quote` | Playfair | 26 / 500 / 36 | -0.01em | Quote |
|
|
99
|
+
| `code-inline` | JetBrains Mono | 13 / 500 / 18 | -0.01em | Código inline |
|
|
100
|
+
| `label-mono` | JetBrains Mono | 11 / 600 / 16 | +0.06em | Label técnica (CAPS) |
|
|
101
|
+
|
|
102
|
+
> Escala transiciona de monumental (desktop) a denso (mobile) sem clipping nem wrap ruim.
|
|
103
|
+
|
|
104
|
+
### Raios (curvatura "Soft", disciplined)
|
|
105
|
+
|
|
106
|
+
| Token | Valor | Uso |
|
|
107
|
+
| --- | --- | --- |
|
|
108
|
+
| `sm` | `0.125rem` | Micro-chip |
|
|
109
|
+
| `DEFAULT` | `0.25rem` | Botão, input (estética CAD/IDE) |
|
|
110
|
+
| `md` | `0.375rem` | Input médio, select |
|
|
111
|
+
| `lg` | `0.5rem` | Card, data module |
|
|
112
|
+
| `xl` | `0.75rem` | Panel grande |
|
|
113
|
+
| `full` | `9999px` | **Só** badge de status/online |
|
|
114
|
+
|
|
115
|
+
### Espaçamento (grid de 8pt, ritmo vertical)
|
|
116
|
+
|
|
117
|
+
| Token | Valor | Uso |
|
|
118
|
+
| --- | --- | --- |
|
|
119
|
+
| `gutter` | `1.5rem` | Gutter mobile |
|
|
120
|
+
| `gutter-desktop` | `2rem` | Gutter desktop |
|
|
121
|
+
| `margin` | `1rem` | Margem mobile |
|
|
122
|
+
| `margin-tablet` | `2rem` | Margem tablet |
|
|
123
|
+
| `margin-desktop` | `3rem` | Margem desktop |
|
|
124
|
+
| `space-xs` | `0.25rem` | Micro gap |
|
|
125
|
+
| `space-sm` | `0.5rem` | Gap apertado (data grid) |
|
|
126
|
+
| `space-md` | `1rem` | Gap padrão |
|
|
127
|
+
| `space-lg` | `1.5rem` | Gap de seção |
|
|
128
|
+
| `space-xl` | `2.5rem` | Gap amplo |
|
|
129
|
+
| `space-2xl` | `4rem` | Respiro de seção (mobile) |
|
|
130
|
+
| `space-3xl` | `6rem` | Respiro de seção (desktop) |
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 🏔 3. ELEVATION & DEPTH
|
|
135
|
+
|
|
136
|
+
**Sem drop shadow pesado.** Profundidade = tiering + glass + micro-border.
|
|
137
|
+
|
|
138
|
+
- **Tier 0 (Canvas):** `#0A0D12` + padrão de micro-dot grid `1px` (`rgba(255,255,255,0.03)`).
|
|
139
|
+
- **Tier 1 (Cards):** `#11151C` com borda contínua `1px #1E2633`.
|
|
140
|
+
- **Tier 2 (Overlay/Hover/Focus):** `#181E27` com borda nítida `#2D384B` + micro-glow localizado.
|
|
141
|
+
- **Gradientes radiais:** `rgba(186,243,54,0.04)` e `rgba(52,211,153,0.03)` atrás de diagramas de arquitetura. Difusos, sem poluir leitura.
|
|
142
|
+
- **Glassmorphism:** nav rails e status bars persistentes = `backdrop-filter: blur(12px)` + slate semi-transparente `rgba(10,13,18,0.82)` + hairline inferior `rgba(30,38,51,0.9)`.
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## 📐 4. LAYOUT & SPACING
|
|
147
|
+
|
|
148
|
+
- **Grid:** 12 colunas matemáticas, baseline vertical estrita de 8pt.
|
|
149
|
+
- **Largura máxima:** `1320px`, centralizado, dentro de gutters de alto contraste.
|
|
150
|
+
- **Ritmo de seção:** módulos maiores respiram com `space-3xl` (desktop) → `space-2xl` (mobile). Presença de portfólio de museu.
|
|
151
|
+
- **Densidade:** micro-componentes (data grid, métrica, stack) usam padding apertado `space-sm`–`space-md`. Equilíbrio entre respiro e densidade.
|
|
152
|
+
- **Breakpoints adaptativos:**
|
|
153
|
+
- **Mobile (<768px):** reflow 4 colunas, métrica empilhada, tier de arquitetura em largura total com borda separadora.
|
|
154
|
+
- **Tablet (768–1024px):** layout 8 colunas, cards de métrica em dupla, sidebar condensado.
|
|
155
|
+
- **Desktop (>1024px):** 12 colunas, canvas de arquitetura multi-tier, deep-dives lado a lado.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 🧱 5. COMPONENTES
|
|
160
|
+
|
|
161
|
+
### Botões
|
|
162
|
+
|
|
163
|
+
| Variante | Visual | Regra |
|
|
164
|
+
| --- | --- | --- |
|
|
165
|
+
| **Primary (ação executiva/CTA)** | bg `#BAF336`, texto `#0A0D12`, Manrope 600 | Hover: bg `#C8F75A` + `box-shadow 0 0 16px rgba(186,243,54,0.3)`. Active: `scale(0.98)`. |
|
|
166
|
+
| **Secondary (deep dive)** | bg `transparent`, borda `1px #1E2633`, texto `#F4F1EA` | Hover: borda `#94A3B8` + bg `rgba(255,255,255,0.04)`. |
|
|
167
|
+
| **Ghost / Copy code** | JetBrains Mono 11px CAPS, transparente, ícone em container suave | Tooltip de confirmação instantâneo ao copiar. |
|
|
168
|
+
|
|
169
|
+
### Executive KPI Metric Card
|
|
170
|
+
|
|
171
|
+
- Mostra impacto financeiro ("R$ 24M/ano salvos", "100M msgs/dia", "R$ 100 bi em custódia").
|
|
172
|
+
- Construção em duas partes: **header mono** (`label-mono`) com ponto de status pulsante → **estatística monumental** (`metric-stat`) → **subtexto anotado** com escopo técnico e ROI de negócio.
|
|
173
|
+
- Borda interna `1px #1E2633` + glow de canto superior no hover em `#BAF336`.
|
|
174
|
+
|
|
175
|
+
### Chips & Badges de Taxonomia (Tecnologia)
|
|
176
|
+
|
|
177
|
+
- JetBrains Mono, 11px CAPS, padding `4px 8px`.
|
|
178
|
+
- **Inativo:** bg `#11151C`, borda `#1E2633`, texto `#94A3B8`.
|
|
179
|
+
- **Ativo/Destaque:** bg `rgba(186,243,54,0.08)`, borda `rgba(186,243,54,0.4)`, texto `#BAF336`.
|
|
180
|
+
|
|
181
|
+
### Diagramas de Arquitetura / Fluxo
|
|
182
|
+
|
|
183
|
+
- Containers de nó em ardósia escura, conectados por vetores de 1px.
|
|
184
|
+
- Nó **ativo:** anel de status pulsante lime/mint. Nó inativo/legacy: `#56657A`.
|
|
185
|
+
- Drawer de tooltip desliza da borda direita com snippets, benchmarks de latência e decisões arquiteturais.
|
|
186
|
+
|
|
187
|
+
### Inputs & Campos de Terminal
|
|
188
|
+
|
|
189
|
+
- Container minimalista, bg `#0A0D12`, borda `1px #1E2633`, placeholder `#56657A`.
|
|
190
|
+
- Foco: hairline migra para `#BAF336` (sem outline grosso).
|
|
191
|
+
|
|
192
|
+
### Project Showcase & Drawer de Recrutador
|
|
193
|
+
|
|
194
|
+
- Cards com split: métricas de sistema à esquerda, arquitetura/stack interativa à direita.
|
|
195
|
+
- Barra de scan rápido de metadata: Role, Team Size, Scale, Core Tech, Direct Fiscal Impact.
|
|
196
|
+
- Drawer expansível com bullets: **Problem**, **Scale & Complexity**, **Architectural Decision**, **Measured Outcome**.
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## 🧠 6. UX (Regras de interação)
|
|
201
|
+
|
|
202
|
+
1. **Feedback imediato (dopamina):** clicou? loading IMEDIATO. Deu certo? toast de sucesso. Deu erro? toast de erro. **Zero ações sem resposta.**
|
|
203
|
+
2. **Foco único:** uma tela = um objetivo. Nada de 50 formulários. Complexo → modal/wizard.
|
|
204
|
+
3. **Micro-interações:** `hover:` em tudo que é clicável. O usuário precisa sentir a tela viva.
|
|
205
|
+
4. **Acessibilidade real:** contraste que passa. Texto secundário não some. O que importa **grita**.
|
|
206
|
+
5. **Animações** respeitam `prefers-reduced-motion`. Transições ≤ 200ms para feedback, ≤ 400ms para drawer/modal.
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## 🚫 PROIBIÇÕES (resumo de uma linha)
|
|
211
|
+
|
|
212
|
+
- ❌ Cor/rgba literal em componente (use tokens).
|
|
213
|
+
- ❌ Modo claro (é dark only).
|
|
214
|
+
- ❌ Lib de UI além de shadcn ([stacks/shadcn.md](./stacks/shadcn.md)).
|
|
215
|
+
- ❌ Drop shadow pesado.
|
|
216
|
+
- ❌ Pill shape fora de status/online.
|
|
217
|
+
- ❌ >1 acento de cor competindo na mesma tela.
|
|
218
|
+
- ❌ Sem `focus-visible` em nada interativo.
|
|
219
|
+
- ❌ Grid que não é 12 colunas / max-width 1320px.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Marcelino Sandroni
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|