@cupcodev/ui 7.0.0 → 8.0.0
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/README.md +239 -239
- package/dist/index.cjs +3604 -2715
- package/dist/index.d.cts +61 -4
- package/dist/index.d.ts +61 -4
- package/dist/index.js +3561 -2667
- package/dist/styles.css +3 -3
- package/package.json +189 -187
- package/postinstall.cjs +20 -20
- package/styles/base.css +140 -138
- package/styles/dock.css +868 -813
- package/styles/global.css +2073 -2071
- package/styles/tokens.css +415 -415
- package/tailwind-preset.cjs +196 -196
package/README.md
CHANGED
|
@@ -1,239 +1,239 @@
|
|
|
1
|
-
## @cupcodev/ui
|
|
2
|
-
|
|
3
|
-
Design system Cupcode pronto para uso (componentes React + estilos + preset Tailwind).
|
|
4
|
-
|
|
5
|
-
### Instalação
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install @cupcodev/ui
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
Além do pacote, instale as peer dependencies listadas em `peerDependencies` (React 18, Tailwind 3, Radix UI, etc.). Um comando típico:
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
npm install react react-dom tailwindcss class-variance-authority tailwind-merge lucide-react \
|
|
15
|
-
cmdk date-fns embla-carousel-react input-otp react-day-picker react-resizable-panels recharts sonner vaul \
|
|
16
|
-
@radix-ui/react-accordion @radix-ui/react-alert-dialog @radix-ui/react-aspect-ratio @radix-ui/react-avatar \
|
|
17
|
-
@radix-ui/react-checkbox @radix-ui/react-collapsible @radix-ui/react-context-menu @radix-ui/react-dialog \
|
|
18
|
-
@radix-ui/react-dropdown-menu @radix-ui/react-hover-card @radix-ui/react-label @radix-ui/react-menubar \
|
|
19
|
-
@radix-ui/react-navigation-menu @radix-ui/react-popover @radix-ui/react-progress @radix-ui/react-radio-group \
|
|
20
|
-
@radix-ui/react-scroll-area @radix-ui/react-select @radix-ui/react-separator @radix-ui/react-slider \
|
|
21
|
-
@radix-ui/react-slot @radix-ui/react-switch @radix-ui/react-tabs @radix-ui/react-toast @radix-ui/react-toggle \
|
|
22
|
-
@radix-ui/react-toggle-group @radix-ui/react-tooltip tailwindcss-animate @tailwindcss/typography
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
Compatibilidade de runtime: Node.js `>=18.18.0`.
|
|
26
|
-
Compatibilidade de estilo: Tailwind CSS v3 (`tailwindcss@^3.4.x`).
|
|
27
|
-
Gerenciador oficial: `npm` (lockfile único: `package-lock.json`).
|
|
28
|
-
|
|
29
|
-
### Styles (`styles.css` compilado)
|
|
30
|
-
|
|
31
|
-
Para carregar o visual completo dos componentes (incluindo `UserMenuCupcode`, chat, modal Telescup e classes do Dock), basta:
|
|
32
|
-
|
|
33
|
-
```ts
|
|
34
|
-
import "@cupcodev/ui/styles.css";
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Se o app também usa Tailwind, o preset continua disponível:
|
|
38
|
-
|
|
39
|
-
```js
|
|
40
|
-
// tailwind.config.js
|
|
41
|
-
module.exports = {
|
|
42
|
-
presets: [require("@cupcodev/ui/tailwind-preset.cjs")],
|
|
43
|
-
content: ["./src/**/*.{ts,tsx}"],
|
|
44
|
-
};
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Se voce quiser apenas variaveis + base minima (sem classes utilitarias/glass/dock), use:
|
|
48
|
-
|
|
49
|
-
```ts
|
|
50
|
-
import "@cupcodev/ui/styles/base.css";
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
Importante:
|
|
54
|
-
- `styles.css` agora ja vem compilado para uso direto no app consumidor.
|
|
55
|
-
- O build de `styles.css` usa `styles/index.css` como source of truth (tokens + global + dock).
|
|
56
|
-
- `styles/global.css` nao deve ser usado isoladamente, porque nao inclui os tokens.
|
|
57
|
-
- `styles/base.css` e o entrypoint seguro para tema/tokens quando voce nao quer carregar o pacote visual completo.
|
|
58
|
-
- `JellyButton` (Blob CTA), `VideoWatchButton` e classes visuais do Dock dependem de `styles.css`.
|
|
59
|
-
- Politica de cor: use `cupcode-hover`/`--cc-hover-overlay` (`#975ab6` a `30%`) para hover/interacao e reserve `cupcode-pink` para destaques fortes (ex.: badges).
|
|
60
|
-
|
|
61
|
-
### Config de runtime (env no app consumidor)
|
|
62
|
-
|
|
63
|
-
Para componentes que dependem de env em runtime (chat/supabase/telescup), configure uma vez no bootstrap do app:
|
|
64
|
-
|
|
65
|
-
```ts
|
|
66
|
-
import { setCupcodeRuntimeEnv } from "@cupcodev/ui";
|
|
67
|
-
|
|
68
|
-
setCupcodeRuntimeEnv({
|
|
69
|
-
VITE_APP_VERSION: import.meta.env.VITE_APP_VERSION,
|
|
70
|
-
VITE_SUPABASE_URL: import.meta.env.VITE_SUPABASE_URL,
|
|
71
|
-
VITE_SUPABASE_ANON_KEY: import.meta.env.VITE_SUPABASE_ANON_KEY,
|
|
72
|
-
VITE_TELESCUP_BASE_URL: import.meta.env.VITE_TELESCUP_BASE_URL,
|
|
73
|
-
VITE_TELESCUP_API_BASE: import.meta.env.VITE_TELESCUP_API_BASE,
|
|
74
|
-
});
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
Para manter a versão do menu do usuário sincronizada com o `package.json` do app consumidor, injete `VITE_APP_VERSION` via Vite:
|
|
78
|
-
|
|
79
|
-
```ts
|
|
80
|
-
// vite.config.ts
|
|
81
|
-
import packageJson from "./package.json" with { type: "json" };
|
|
82
|
-
|
|
83
|
-
export default defineConfig({
|
|
84
|
-
define: {
|
|
85
|
-
"import.meta.env.VITE_APP_VERSION": JSON.stringify(packageJson.version),
|
|
86
|
-
},
|
|
87
|
-
});
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
`UserMenuCupcode` (e `MainNavbar`) aceitam `appVersion` para override explícito. Sem prop, o menu resolve a versão via runtime env pelas chaves exportadas em `CUPCODE_APP_VERSION_ENV_KEYS`.
|
|
91
|
-
|
|
92
|
-
Observação:
|
|
93
|
-
- Ao instalar/atualizar `@cupcodev/ui`, o pacote exibe esse lembrete no `postinstall`.
|
|
94
|
-
- Se o projeto usa `npm install --ignore-scripts`, esse aviso não aparece; nesse caso, aplique a configuração manualmente.
|
|
95
|
-
|
|
96
|
-
### Uso básico
|
|
97
|
-
|
|
98
|
-
```tsx
|
|
99
|
-
import { Button } from "@cupcodev/ui";
|
|
100
|
-
|
|
101
|
-
export default function Example() {
|
|
102
|
-
return <Button variant="default">Oi Cupcode</Button>;
|
|
103
|
-
}
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
Todos os componentes Cupcode e shadcn/ui base são reexportados de `@cupcodev/ui`.
|
|
107
|
-
|
|
108
|
-
### Contrato de API (Source of Truth do DS)
|
|
109
|
-
|
|
110
|
-
Para manter layout/CSS 100% padronizado nos apps consumidores:
|
|
111
|
-
|
|
112
|
-
1. Sempre importe os estilos globais do pacote uma única vez no bootstrap:
|
|
113
|
-
|
|
114
|
-
```ts
|
|
115
|
-
import "@cupcodev/ui/styles.css";
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
2. Use os componentes canonicos do DS no import principal:
|
|
119
|
-
- `Tabs`, `TabsList`, `TabsTrigger`, `TabsContent` (versao Cupcode)
|
|
120
|
-
- `Tooltip`, `TooltipProvider`, `TooltipTrigger`, `TooltipContent` (versao Cupcode)
|
|
121
|
-
- `Skeleton` e `SkeletonText` (versao Cupcode)
|
|
122
|
-
|
|
123
|
-
3. Se realmente precisar do comportamento visual bruto do shadcn, use os exports `Primitive*`:
|
|
124
|
-
- `PrimitiveTabs`, `PrimitiveTabsList`, `PrimitiveTabsTrigger`, `PrimitiveTabsContent`
|
|
125
|
-
- `PrimitiveTooltip`, `PrimitiveTooltipProvider`, `PrimitiveTooltipTrigger`, `PrimitiveTooltipContent`
|
|
126
|
-
- `PrimitiveSkeleton`
|
|
127
|
-
|
|
128
|
-
Assim evitamos drift visual entre apps e garantimos o DS como fonte unica de verdade.
|
|
129
|
-
|
|
130
|
-
### MainNavbar sem router obrigatório
|
|
131
|
-
|
|
132
|
-
`MainNavbar` não depende de `react-router-dom`. Para integração SPA, passe `pathname` e `onNavigate`.
|
|
133
|
-
O pacote não injeta logo da Cupcode por padrão. Se quiser ocupar a área de marca, passe `logo` com o visual do seu app:
|
|
134
|
-
|
|
135
|
-
```tsx
|
|
136
|
-
import { MainNavbar, TelescupImage } from "@cupcodev/ui";
|
|
137
|
-
import { useLocation, useNavigate } from "react-router-dom";
|
|
138
|
-
|
|
139
|
-
export function Header() {
|
|
140
|
-
const location = useLocation();
|
|
141
|
-
const navigate = useNavigate();
|
|
142
|
-
const appLogo = (
|
|
143
|
-
<TelescupImage
|
|
144
|
-
apiId="SEU-LOGO-ID"
|
|
145
|
-
imageWidth={120}
|
|
146
|
-
imageHeight={32}
|
|
147
|
-
alt="Meu app"
|
|
148
|
-
className="h-8 w-auto"
|
|
149
|
-
/>
|
|
150
|
-
);
|
|
151
|
-
|
|
152
|
-
return (
|
|
153
|
-
<MainNavbar
|
|
154
|
-
logo={appLogo}
|
|
155
|
-
pathname={location.pathname}
|
|
156
|
-
onNavigate={(href) => navigate(href)}
|
|
157
|
-
/>
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
### ThemeToggle sem next-themes obrigatório
|
|
163
|
-
|
|
164
|
-
`ThemeToggle` alterna a classe `dark` no `document.documentElement` quando usado de forma não-controlada:
|
|
165
|
-
|
|
166
|
-
```tsx
|
|
167
|
-
import { ThemeToggle } from "@cupcodev/ui";
|
|
168
|
-
|
|
169
|
-
export function HeaderActions() {
|
|
170
|
-
return <ThemeToggle />;
|
|
171
|
-
}
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
Modo controlado (opcional):
|
|
175
|
-
|
|
176
|
-
```tsx
|
|
177
|
-
<ThemeToggle theme={theme} onThemeChange={setTheme} />
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
### Qualidade e CI
|
|
181
|
-
|
|
182
|
-
Validações automatizadas disponíveis no projeto:
|
|
183
|
-
|
|
184
|
-
```bash
|
|
185
|
-
npm run lint
|
|
186
|
-
npm run typecheck
|
|
187
|
-
npm run check:exports
|
|
188
|
-
npm run build:lib
|
|
189
|
-
npm run build:site
|
|
190
|
-
npm run test:consumer
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
- `lint` roda com `--max-warnings=0` (qualquer warning quebra o gate).
|
|
194
|
-
- `typecheck`: valida tipos com `tsc -b` usando as configs estritas do projeto.
|
|
195
|
-
- `check:exports`: garante que modulos DS Core com exports nomeados estao representados na API publica (`src/index.ts`).
|
|
196
|
-
- `build:lib`: gera o pacote publicável (`dist`) via `tsup` sem sourcemaps.
|
|
197
|
-
- `build:site`: gera somente o site/docs via Vite.
|
|
198
|
-
- `test:consumer`: cria um projeto externo temporário, instala o tarball de `@cupcodev/ui`, valida imports do pacote e valida `typecheck + build` (incluindo snippets CSS do Dock no bundle final).
|
|
199
|
-
- `prepublishOnly` executa `check:release` (`lint + typecheck + check:exports + build:lib`) antes de qualquer publicação.
|
|
200
|
-
- Pipeline CI em `.github/workflows/ci.yml` roda `check:release`, `build:site` e `test:consumer` em todo push/PR.
|
|
201
|
-
|
|
202
|
-
App de consumo real versionado: `examples/vite-consumer`.
|
|
203
|
-
|
|
204
|
-
### Setup do chat (Supabase + Realtime)
|
|
205
|
-
|
|
206
|
-
Para configurar o chat com dados reais e notificacoes em tempo real:
|
|
207
|
-
|
|
208
|
-
1. Use `.env.chat.example` como referencia para preencher seu `.env.local`.
|
|
209
|
-
2. Rode no SQL Editor do Supabase:
|
|
210
|
-
- `scripts/supabase/chat/00_bootstrap_chat_public.sql`
|
|
211
|
-
- `scripts/supabase/chat/01_confirm_tables.sql`
|
|
212
|
-
- `scripts/supabase/chat/02_confirm_columns.sql`
|
|
213
|
-
- `scripts/supabase/chat/03_enable_realtime.sql`
|
|
214
|
-
- `scripts/supabase/chat/04_verify_realtime.sql`
|
|
215
|
-
- `scripts/supabase/chat/06_fix_rls_and_avatars_for_external_auth.sql` (se usar auth externa)
|
|
216
|
-
- `scripts/supabase/chat/15_enable_presence_global_realtime.sql` (presenca global com idle auto)
|
|
217
|
-
- `scripts/supabase/chat/16_verify_presence_global_realtime.sql`
|
|
218
|
-
3. Reinicie o app: `npm run dev`.
|
|
219
|
-
4. Valide o fluxo com `scripts/supabase/chat/05_acceptance_checks.sql`.
|
|
220
|
-
|
|
221
|
-
Guia completo: `docs/chat-supabase-setup.md`.
|
|
222
|
-
|
|
223
|
-
### Peers
|
|
224
|
-
|
|
225
|
-
| Pacote | Versão mínima | Uso no DS |
|
|
226
|
-
| --- | --- | --- |
|
|
227
|
-
| `react`, `react-dom` | ^18.3.1 | base dos componentes |
|
|
228
|
-
| `tailwindcss` | ^3.4.17 | util classes + preset |
|
|
229
|
-
| `class-variance-authority`, `tailwind-merge` | ^0.7.1 / ^2.6.0 | variantes e merge de classes |
|
|
230
|
-
| `lucide-react` | ^0.462.0 | ícones |
|
|
231
|
-
| `@radix-ui/*` | conforme `package.json` | primitives dos componentes shadcn |
|
|
232
|
-
| `cmdk`, `date-fns`, `embla-carousel-react`, `react-day-picker`, `input-otp`, `react-resizable-panels`, `recharts`, `sonner`, `vaul` | conforme `package.json` | componentes específicos |
|
|
233
|
-
| `tailwindcss-animate`, `@tailwindcss/typography` | ^1.0.7 / ^0.5.16 | plugins usados pelo preset |
|
|
234
|
-
|
|
235
|
-
Consulte `peerDependencies` para a lista completa ao instalar.
|
|
236
|
-
|
|
237
|
-
### Tipos e superfícies
|
|
238
|
-
|
|
239
|
-
Importe de `@cupcodev/ui` para manter tipos e estilos alinhados. Para gráficos, use também o submódulo `@cupcodev/ui/charts`.
|
|
1
|
+
## @cupcodev/ui
|
|
2
|
+
|
|
3
|
+
Design system Cupcode pronto para uso (componentes React + estilos + preset Tailwind).
|
|
4
|
+
|
|
5
|
+
### Instalação
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @cupcodev/ui
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Além do pacote, instale as peer dependencies listadas em `peerDependencies` (React 18, Tailwind 3, Radix UI, etc.). Um comando típico:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install react react-dom tailwindcss class-variance-authority tailwind-merge lucide-react \
|
|
15
|
+
cmdk date-fns embla-carousel-react input-otp react-day-picker react-resizable-panels recharts sonner vaul \
|
|
16
|
+
@radix-ui/react-accordion @radix-ui/react-alert-dialog @radix-ui/react-aspect-ratio @radix-ui/react-avatar \
|
|
17
|
+
@radix-ui/react-checkbox @radix-ui/react-collapsible @radix-ui/react-context-menu @radix-ui/react-dialog \
|
|
18
|
+
@radix-ui/react-dropdown-menu @radix-ui/react-hover-card @radix-ui/react-label @radix-ui/react-menubar \
|
|
19
|
+
@radix-ui/react-navigation-menu @radix-ui/react-popover @radix-ui/react-progress @radix-ui/react-radio-group \
|
|
20
|
+
@radix-ui/react-scroll-area @radix-ui/react-select @radix-ui/react-separator @radix-ui/react-slider \
|
|
21
|
+
@radix-ui/react-slot @radix-ui/react-switch @radix-ui/react-tabs @radix-ui/react-toast @radix-ui/react-toggle \
|
|
22
|
+
@radix-ui/react-toggle-group @radix-ui/react-tooltip tailwindcss-animate @tailwindcss/typography
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Compatibilidade de runtime: Node.js `>=18.18.0`.
|
|
26
|
+
Compatibilidade de estilo: Tailwind CSS v3 (`tailwindcss@^3.4.x`).
|
|
27
|
+
Gerenciador oficial: `npm` (lockfile único: `package-lock.json`).
|
|
28
|
+
|
|
29
|
+
### Styles (`styles.css` compilado)
|
|
30
|
+
|
|
31
|
+
Para carregar o visual completo dos componentes (incluindo `UserMenuCupcode`, chat, modal Telescup e classes do Dock), basta:
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
import "@cupcodev/ui/styles.css";
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Se o app também usa Tailwind, o preset continua disponível:
|
|
38
|
+
|
|
39
|
+
```js
|
|
40
|
+
// tailwind.config.js
|
|
41
|
+
module.exports = {
|
|
42
|
+
presets: [require("@cupcodev/ui/tailwind-preset.cjs")],
|
|
43
|
+
content: ["./src/**/*.{ts,tsx}"],
|
|
44
|
+
};
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Se voce quiser apenas variaveis + base minima (sem classes utilitarias/glass/dock), use:
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
import "@cupcodev/ui/styles/base.css";
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Importante:
|
|
54
|
+
- `styles.css` agora ja vem compilado para uso direto no app consumidor.
|
|
55
|
+
- O build de `styles.css` usa `styles/index.css` como source of truth (tokens + global + dock).
|
|
56
|
+
- `styles/global.css` nao deve ser usado isoladamente, porque nao inclui os tokens.
|
|
57
|
+
- `styles/base.css` e o entrypoint seguro para tema/tokens quando voce nao quer carregar o pacote visual completo.
|
|
58
|
+
- `JellyButton` (Blob CTA), `VideoWatchButton` e classes visuais do Dock dependem de `styles.css`.
|
|
59
|
+
- Politica de cor: use `cupcode-hover`/`--cc-hover-overlay` (`#975ab6` a `30%`) para hover/interacao e reserve `cupcode-pink` para destaques fortes (ex.: badges).
|
|
60
|
+
|
|
61
|
+
### Config de runtime (env no app consumidor)
|
|
62
|
+
|
|
63
|
+
Para componentes que dependem de env em runtime (chat/supabase/telescup), configure uma vez no bootstrap do app:
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
import { setCupcodeRuntimeEnv } from "@cupcodev/ui";
|
|
67
|
+
|
|
68
|
+
setCupcodeRuntimeEnv({
|
|
69
|
+
VITE_APP_VERSION: import.meta.env.VITE_APP_VERSION,
|
|
70
|
+
VITE_SUPABASE_URL: import.meta.env.VITE_SUPABASE_URL,
|
|
71
|
+
VITE_SUPABASE_ANON_KEY: import.meta.env.VITE_SUPABASE_ANON_KEY,
|
|
72
|
+
VITE_TELESCUP_BASE_URL: import.meta.env.VITE_TELESCUP_BASE_URL,
|
|
73
|
+
VITE_TELESCUP_API_BASE: import.meta.env.VITE_TELESCUP_API_BASE,
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Para manter a versão do menu do usuário sincronizada com o `package.json` do app consumidor, injete `VITE_APP_VERSION` via Vite:
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
// vite.config.ts
|
|
81
|
+
import packageJson from "./package.json" with { type: "json" };
|
|
82
|
+
|
|
83
|
+
export default defineConfig({
|
|
84
|
+
define: {
|
|
85
|
+
"import.meta.env.VITE_APP_VERSION": JSON.stringify(packageJson.version),
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
`UserMenuCupcode` (e `MainNavbar`) aceitam `appVersion` para override explícito. Sem prop, o menu resolve a versão via runtime env pelas chaves exportadas em `CUPCODE_APP_VERSION_ENV_KEYS`.
|
|
91
|
+
|
|
92
|
+
Observação:
|
|
93
|
+
- Ao instalar/atualizar `@cupcodev/ui`, o pacote exibe esse lembrete no `postinstall`.
|
|
94
|
+
- Se o projeto usa `npm install --ignore-scripts`, esse aviso não aparece; nesse caso, aplique a configuração manualmente.
|
|
95
|
+
|
|
96
|
+
### Uso básico
|
|
97
|
+
|
|
98
|
+
```tsx
|
|
99
|
+
import { Button } from "@cupcodev/ui";
|
|
100
|
+
|
|
101
|
+
export default function Example() {
|
|
102
|
+
return <Button variant="default">Oi Cupcode</Button>;
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Todos os componentes Cupcode e shadcn/ui base são reexportados de `@cupcodev/ui`.
|
|
107
|
+
|
|
108
|
+
### Contrato de API (Source of Truth do DS)
|
|
109
|
+
|
|
110
|
+
Para manter layout/CSS 100% padronizado nos apps consumidores:
|
|
111
|
+
|
|
112
|
+
1. Sempre importe os estilos globais do pacote uma única vez no bootstrap:
|
|
113
|
+
|
|
114
|
+
```ts
|
|
115
|
+
import "@cupcodev/ui/styles.css";
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
2. Use os componentes canonicos do DS no import principal:
|
|
119
|
+
- `Tabs`, `TabsList`, `TabsTrigger`, `TabsContent` (versao Cupcode)
|
|
120
|
+
- `Tooltip`, `TooltipProvider`, `TooltipTrigger`, `TooltipContent` (versao Cupcode)
|
|
121
|
+
- `Skeleton` e `SkeletonText` (versao Cupcode)
|
|
122
|
+
|
|
123
|
+
3. Se realmente precisar do comportamento visual bruto do shadcn, use os exports `Primitive*`:
|
|
124
|
+
- `PrimitiveTabs`, `PrimitiveTabsList`, `PrimitiveTabsTrigger`, `PrimitiveTabsContent`
|
|
125
|
+
- `PrimitiveTooltip`, `PrimitiveTooltipProvider`, `PrimitiveTooltipTrigger`, `PrimitiveTooltipContent`
|
|
126
|
+
- `PrimitiveSkeleton`
|
|
127
|
+
|
|
128
|
+
Assim evitamos drift visual entre apps e garantimos o DS como fonte unica de verdade.
|
|
129
|
+
|
|
130
|
+
### MainNavbar sem router obrigatório
|
|
131
|
+
|
|
132
|
+
`MainNavbar` não depende de `react-router-dom`. Para integração SPA, passe `pathname` e `onNavigate`.
|
|
133
|
+
O pacote não injeta logo da Cupcode por padrão. Se quiser ocupar a área de marca, passe `logo` com o visual do seu app:
|
|
134
|
+
|
|
135
|
+
```tsx
|
|
136
|
+
import { MainNavbar, TelescupImage } from "@cupcodev/ui";
|
|
137
|
+
import { useLocation, useNavigate } from "react-router-dom";
|
|
138
|
+
|
|
139
|
+
export function Header() {
|
|
140
|
+
const location = useLocation();
|
|
141
|
+
const navigate = useNavigate();
|
|
142
|
+
const appLogo = (
|
|
143
|
+
<TelescupImage
|
|
144
|
+
apiId="SEU-LOGO-ID"
|
|
145
|
+
imageWidth={120}
|
|
146
|
+
imageHeight={32}
|
|
147
|
+
alt="Meu app"
|
|
148
|
+
className="h-8 w-auto"
|
|
149
|
+
/>
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
return (
|
|
153
|
+
<MainNavbar
|
|
154
|
+
logo={appLogo}
|
|
155
|
+
pathname={location.pathname}
|
|
156
|
+
onNavigate={(href) => navigate(href)}
|
|
157
|
+
/>
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### ThemeToggle sem next-themes obrigatório
|
|
163
|
+
|
|
164
|
+
`ThemeToggle` alterna a classe `dark` no `document.documentElement` quando usado de forma não-controlada:
|
|
165
|
+
|
|
166
|
+
```tsx
|
|
167
|
+
import { ThemeToggle } from "@cupcodev/ui";
|
|
168
|
+
|
|
169
|
+
export function HeaderActions() {
|
|
170
|
+
return <ThemeToggle />;
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Modo controlado (opcional):
|
|
175
|
+
|
|
176
|
+
```tsx
|
|
177
|
+
<ThemeToggle theme={theme} onThemeChange={setTheme} />
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Qualidade e CI
|
|
181
|
+
|
|
182
|
+
Validações automatizadas disponíveis no projeto:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
npm run lint
|
|
186
|
+
npm run typecheck
|
|
187
|
+
npm run check:exports
|
|
188
|
+
npm run build:lib
|
|
189
|
+
npm run build:site
|
|
190
|
+
npm run test:consumer
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
- `lint` roda com `--max-warnings=0` (qualquer warning quebra o gate).
|
|
194
|
+
- `typecheck`: valida tipos com `tsc -b` usando as configs estritas do projeto.
|
|
195
|
+
- `check:exports`: garante que modulos DS Core com exports nomeados estao representados na API publica (`src/index.ts`).
|
|
196
|
+
- `build:lib`: gera o pacote publicável (`dist`) via `tsup` sem sourcemaps.
|
|
197
|
+
- `build:site`: gera somente o site/docs via Vite.
|
|
198
|
+
- `test:consumer`: cria um projeto externo temporário, instala o tarball de `@cupcodev/ui`, valida imports do pacote e valida `typecheck + build` (incluindo snippets CSS do Dock no bundle final).
|
|
199
|
+
- `prepublishOnly` executa `check:release` (`lint + typecheck + check:exports + build:lib`) antes de qualquer publicação.
|
|
200
|
+
- Pipeline CI em `.github/workflows/ci.yml` roda `check:release`, `build:site` e `test:consumer` em todo push/PR.
|
|
201
|
+
|
|
202
|
+
App de consumo real versionado: `examples/vite-consumer`.
|
|
203
|
+
|
|
204
|
+
### Setup do chat (Supabase + Realtime)
|
|
205
|
+
|
|
206
|
+
Para configurar o chat com dados reais e notificacoes em tempo real:
|
|
207
|
+
|
|
208
|
+
1. Use `.env.chat.example` como referencia para preencher seu `.env.local`.
|
|
209
|
+
2. Rode no SQL Editor do Supabase:
|
|
210
|
+
- `scripts/supabase/chat/00_bootstrap_chat_public.sql`
|
|
211
|
+
- `scripts/supabase/chat/01_confirm_tables.sql`
|
|
212
|
+
- `scripts/supabase/chat/02_confirm_columns.sql`
|
|
213
|
+
- `scripts/supabase/chat/03_enable_realtime.sql`
|
|
214
|
+
- `scripts/supabase/chat/04_verify_realtime.sql`
|
|
215
|
+
- `scripts/supabase/chat/06_fix_rls_and_avatars_for_external_auth.sql` (se usar auth externa)
|
|
216
|
+
- `scripts/supabase/chat/15_enable_presence_global_realtime.sql` (presenca global com idle auto)
|
|
217
|
+
- `scripts/supabase/chat/16_verify_presence_global_realtime.sql`
|
|
218
|
+
3. Reinicie o app: `npm run dev`.
|
|
219
|
+
4. Valide o fluxo com `scripts/supabase/chat/05_acceptance_checks.sql`.
|
|
220
|
+
|
|
221
|
+
Guia completo: `docs/chat-supabase-setup.md`.
|
|
222
|
+
|
|
223
|
+
### Peers
|
|
224
|
+
|
|
225
|
+
| Pacote | Versão mínima | Uso no DS |
|
|
226
|
+
| --- | --- | --- |
|
|
227
|
+
| `react`, `react-dom` | ^18.3.1 | base dos componentes |
|
|
228
|
+
| `tailwindcss` | ^3.4.17 | util classes + preset |
|
|
229
|
+
| `class-variance-authority`, `tailwind-merge` | ^0.7.1 / ^2.6.0 | variantes e merge de classes |
|
|
230
|
+
| `lucide-react` | ^0.462.0 | ícones |
|
|
231
|
+
| `@radix-ui/*` | conforme `package.json` | primitives dos componentes shadcn |
|
|
232
|
+
| `cmdk`, `date-fns`, `embla-carousel-react`, `react-day-picker`, `input-otp`, `react-resizable-panels`, `recharts`, `sonner`, `vaul` | conforme `package.json` | componentes específicos |
|
|
233
|
+
| `tailwindcss-animate`, `@tailwindcss/typography` | ^1.0.7 / ^0.5.16 | plugins usados pelo preset |
|
|
234
|
+
|
|
235
|
+
Consulte `peerDependencies` para a lista completa ao instalar.
|
|
236
|
+
|
|
237
|
+
### Tipos e superfícies
|
|
238
|
+
|
|
239
|
+
Importe de `@cupcodev/ui` para manter tipos e estilos alinhados. Para gráficos, use também o submódulo `@cupcodev/ui/charts`.
|