ads-nuxt 0.1.0 → 0.1.1
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 +546 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1 +1,546 @@
|
|
|
1
|
-
|
|
1
|
+
# ads-nuxt
|
|
2
|
+
|
|
3
|
+
**Alquimia Design System (ADS)** para Nuxt, construído sobre o [Nuxt UI](https://ui.nuxt.com) v4 e o Tailwind CSS v4.
|
|
4
|
+
|
|
5
|
+
O pacote é uma **Nuxt Layer**: ao estendê-lo, seu projeto recebe de uma vez os componentes `Ads*`, os tokens de design (cores, espaçamento, raios, sombras, tipografia), o tema do Nuxt UI customizado, os utilitários de formatação em pt-BR e a fonte Inter.
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/ads-nuxt)
|
|
8
|
+
[](./LICENSE)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Sumário
|
|
13
|
+
|
|
14
|
+
- [Recursos](#recursos)
|
|
15
|
+
- [Requisitos](#requisitos)
|
|
16
|
+
- [Instalação](#instalação)
|
|
17
|
+
- [Configuração](#configuração)
|
|
18
|
+
- [Uso rápido](#uso-rápido)
|
|
19
|
+
- [Componentes](#componentes)
|
|
20
|
+
- [Exemplos](#exemplos)
|
|
21
|
+
- [Tokens de design](#tokens-de-design)
|
|
22
|
+
- [Tema do Nuxt UI](#tema-do-nuxt-ui)
|
|
23
|
+
- [Composables](#composables)
|
|
24
|
+
- [Utilitários](#utilitários)
|
|
25
|
+
- [Localização (pt-BR)](#localização-pt-br)
|
|
26
|
+
- [Desenvolvimento](#desenvolvimento)
|
|
27
|
+
- [Estrutura do projeto](#estrutura-do-projeto)
|
|
28
|
+
- [Licença](#licença)
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Recursos
|
|
33
|
+
|
|
34
|
+
- **Mais de 50 componentes** prontos para produção, com prefixo `Ads` (auto-importados pelo Nuxt).
|
|
35
|
+
- **Tokens em três camadas** (primitivos → semânticos → de componente), expostos como variáveis CSS `--ads-*` e como cores do Tailwind (`ads-*`).
|
|
36
|
+
- **Tema do Nuxt UI** pré-configurado: botão, input, calendário, select, toast e tooltip já seguem o visual ADS.
|
|
37
|
+
- **Fonte Inter** configurada via `@nuxt/fonts`.
|
|
38
|
+
- **Ícones Lucide** via `@nuxt/icon` (use `i-lucide-*`).
|
|
39
|
+
- **Utilitários pt-BR**: moeda (BRL), porcentagem, datas, notabilidade e filtros.
|
|
40
|
+
- **Playground** com documentação viva de todos os componentes e tokens.
|
|
41
|
+
- Estados “congeláveis” (`state`) nos componentes, pensados para documentação e testes visuais.
|
|
42
|
+
|
|
43
|
+
## Requisitos
|
|
44
|
+
|
|
45
|
+
| Dependência | Versão |
|
|
46
|
+
| ----------- | --------- |
|
|
47
|
+
| Node.js | 20+ (recomendado 22) |
|
|
48
|
+
| Nuxt | `^4.0.0` |
|
|
49
|
+
| Vue | `^3.5.18` |
|
|
50
|
+
|
|
51
|
+
`nuxt` e `vue` são *peer dependencies*. As demais (`@nuxt/ui`, `@nuxt/fonts`, `@nuxt/icon`, `@vueuse/nuxt`, `tailwindcss`, ícones Lucide) já vêm como dependências do pacote.
|
|
52
|
+
|
|
53
|
+
## Instalação
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# pnpm
|
|
57
|
+
pnpm add ads-nuxt
|
|
58
|
+
|
|
59
|
+
# npm
|
|
60
|
+
npm install ads-nuxt
|
|
61
|
+
|
|
62
|
+
# yarn
|
|
63
|
+
yarn add ads-nuxt
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Configuração
|
|
67
|
+
|
|
68
|
+
Estenda a layer no `nuxt.config.ts` do seu projeto:
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
// nuxt.config.ts
|
|
72
|
+
export default defineNuxtConfig({
|
|
73
|
+
extends: ["ads-nuxt"],
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Isso já registra automaticamente:
|
|
78
|
+
|
|
79
|
+
- os módulos `@nuxt/ui`, `@nuxt/fonts`, `@nuxt/icon` e `@vueuse/nuxt`;
|
|
80
|
+
- o CSS global (Tailwind, Nuxt UI, cores e tokens de componente);
|
|
81
|
+
- a fonte **Inter** (pesos 300, 400, 500, 700 e 800);
|
|
82
|
+
- a coleção de ícones **lucide**;
|
|
83
|
+
- o `app.config.ts` com o tema ADS para o Nuxt UI;
|
|
84
|
+
- o plugin de toast e o locale pt-BR.
|
|
85
|
+
|
|
86
|
+
> **Modo de cor:** a layer define `ui.colorMode: false` — o ADS é um sistema de tema claro. Se precisar sobrescrever, redefina no `nuxt.config.ts` do seu projeto.
|
|
87
|
+
|
|
88
|
+
### Envolva o app com `UApp`
|
|
89
|
+
|
|
90
|
+
O Nuxt UI exige o componente `UApp` para toasts, tooltips e overlays funcionarem:
|
|
91
|
+
|
|
92
|
+
```vue
|
|
93
|
+
<!-- app/app.vue -->
|
|
94
|
+
<template>
|
|
95
|
+
<UApp :locale="uiLocale" :tooltip="{ delayDuration: 400 }" :toaster="adsToaster">
|
|
96
|
+
<NuxtPage />
|
|
97
|
+
</UApp>
|
|
98
|
+
</template>
|
|
99
|
+
|
|
100
|
+
<script setup lang="ts">
|
|
101
|
+
import { uiLocale } from "ads-nuxt/app/locale/pt-br";
|
|
102
|
+
import { adsToaster } from "ads-nuxt/app/theme/ads-theme";
|
|
103
|
+
</script>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
`adsToaster` posiciona os toasts no canto superior direito, sem barra de progresso, no padrão ADS.
|
|
107
|
+
|
|
108
|
+
## Uso rápido
|
|
109
|
+
|
|
110
|
+
Os componentes são auto-importados, sem `import` manual:
|
|
111
|
+
|
|
112
|
+
```vue
|
|
113
|
+
<template>
|
|
114
|
+
<AdsCard title="Cadastro" description="Preencha os dados abaixo.">
|
|
115
|
+
<div class="flex flex-col gap-4">
|
|
116
|
+
<AdsInput v-model="nome" label="Nome" placeholder="Digite seu nome" />
|
|
117
|
+
<AdsButton type="filled" label="Salvar" leading icon="i-lucide-save" />
|
|
118
|
+
</div>
|
|
119
|
+
</AdsCard>
|
|
120
|
+
</template>
|
|
121
|
+
|
|
122
|
+
<script setup lang="ts">
|
|
123
|
+
const nome = ref("");
|
|
124
|
+
</script>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Componentes
|
|
128
|
+
|
|
129
|
+
### Ações
|
|
130
|
+
|
|
131
|
+
| Componente | Descrição |
|
|
132
|
+
| ---------------- | --------- |
|
|
133
|
+
| `AdsButton` | Botão (`filled`, `outline`, `unfilled`, `secondary`, `ia`) em 2 tamanhos e 8 cores. Suporta ícones, `loading` e `to` (vira link). |
|
|
134
|
+
| `AdsButtonGroup` | Agrupa botões. |
|
|
135
|
+
| `AdsButtonMenu` | Botão com menu de ações. |
|
|
136
|
+
|
|
137
|
+
### Formulários
|
|
138
|
+
|
|
139
|
+
| Componente | Descrição |
|
|
140
|
+
| ----------------- | --------- |
|
|
141
|
+
| `AdsInput` | Campo de texto/número com label, hint, erro, info, ícone e sufixo. |
|
|
142
|
+
| `AdsNumberInput` | Campo numérico dedicado. |
|
|
143
|
+
| `AdsTextarea` | Área de texto. |
|
|
144
|
+
| `AdsSearchInput` | Campo de busca. |
|
|
145
|
+
| `AdsCheckbox` | Checkbox com estado indeterminado. |
|
|
146
|
+
| `AdsRadio` | Botão de rádio. |
|
|
147
|
+
| `AdsSwitch` | Alternador (toggle). |
|
|
148
|
+
| `AdsDatePicker` | Seletor de data ou intervalo, com `min`, `max` e `maximumDays`. |
|
|
149
|
+
| `AdsMonthPicker` | Seletor de mês. |
|
|
150
|
+
| `AdsFilterSelect` | Filtro com seleção (checkbox, radio ou mês). |
|
|
151
|
+
| `AdsFilterDropdown` / `AdsFilterOption` | Dropdown de filtros e suas opções. |
|
|
152
|
+
|
|
153
|
+
### Navegação
|
|
154
|
+
|
|
155
|
+
| Componente | Descrição |
|
|
156
|
+
| ----------------- | --------- |
|
|
157
|
+
| `AdsNavbarDesk` / `AdsNavbarApp` | Barra de navegação desktop e mobile. |
|
|
158
|
+
| `AdsSideMenu` | Menu lateral. |
|
|
159
|
+
| `AdsMenuBar` | Barra de menu. |
|
|
160
|
+
| `AdsTabs` | Abas em formato de link. |
|
|
161
|
+
| `AdsSegmentedTabs`| Abas segmentadas. |
|
|
162
|
+
| `AdsPagination` | Paginação com reticências automáticas (`v-model:page`). |
|
|
163
|
+
| `AdsDropdownMenu` / `AdsListDropdown` | Menus suspensos. |
|
|
164
|
+
| `AdsFooter` | Rodapé. |
|
|
165
|
+
|
|
166
|
+
### Exibição de dados
|
|
167
|
+
|
|
168
|
+
| Componente | Descrição |
|
|
169
|
+
| ----------------- | --------- |
|
|
170
|
+
| `AdsTable` | Tabela baseada no `UTable`, com densidade, zebra, bordas, degradê por nível, `sticky`, loading e estado vazio. |
|
|
171
|
+
| `AdsTableToolbar` | Barra de ferramentas da tabela. |
|
|
172
|
+
| `AdsCard` | Cartão genérico. |
|
|
173
|
+
| `AdsMetricCard` | Cartão de métrica/indicador. |
|
|
174
|
+
| `AdsFeatureCard` | Cartão de funcionalidade. |
|
|
175
|
+
| `AdsFileCard` | Cartão de arquivo. |
|
|
176
|
+
| `AdsEmptyState` | Estado vazio. |
|
|
177
|
+
|
|
178
|
+
### Indicadores e status
|
|
179
|
+
|
|
180
|
+
| Componente | Descrição |
|
|
181
|
+
| -------------------- | --------- |
|
|
182
|
+
| `AdsBadge` | Contador ou ponto (`mini`) em 7 cores. |
|
|
183
|
+
| `AdsPill` | Pílula de status (`default`, `success`, `attention`, `warning`, `new`, `blocked`, `innovation`, `neutral`) em tom `primary` ou `secondary`. |
|
|
184
|
+
| `AdsMiniPill` | Versão compacta da pílula. |
|
|
185
|
+
| `AdsNotabilityPill` | Pílula de notabilidade. |
|
|
186
|
+
| `AdsFarmarcasPill` | Pílula de marca Farmarcas. |
|
|
187
|
+
| `AdsProductTag` | Tag de produto. |
|
|
188
|
+
|
|
189
|
+
### Feedback e overlays
|
|
190
|
+
|
|
191
|
+
| Componente | Descrição |
|
|
192
|
+
| ----------------- | --------- |
|
|
193
|
+
| `AdsModal` | Modal (`dialog` ou `sheet`) com 5 tamanhos, ações padrão e slots. |
|
|
194
|
+
| `AdsToast` | Aviso em faixa (`banner`) ou reporte escuro (`status`). |
|
|
195
|
+
| `AdsBroadcast` | Comunicado em destaque. |
|
|
196
|
+
| `AdsTooltip` | Tooltip. |
|
|
197
|
+
| `AdsSmalltip` / `AdsSteptip` / `AdsCharttip` | Variações de tooltip (compacta, em passos e para gráficos). |
|
|
198
|
+
| `AdsLoading` | Indicador de carregamento. |
|
|
199
|
+
| `ProgressBarLoading` | Barra de progresso. |
|
|
200
|
+
| `OverlayLoading` | Overlay de carregamento/sucesso/erro (usado por `useOverlayLoading`). |
|
|
201
|
+
|
|
202
|
+
## Exemplos
|
|
203
|
+
|
|
204
|
+
### Botões
|
|
205
|
+
|
|
206
|
+
```vue
|
|
207
|
+
<AdsButton type="filled" label="Salvar" />
|
|
208
|
+
<AdsButton type="outline" color="success" label="Aprovar" />
|
|
209
|
+
<AdsButton type="unfilled" size="sm" label="Cancelar" />
|
|
210
|
+
<AdsButton type="ia" label="Gerar com IA" leading icon="i-lucide-sparkles" />
|
|
211
|
+
<AdsButton type="filled" label="Enviando" loading />
|
|
212
|
+
<AdsButton type="filled" label="Ir para o painel" to="/painel" />
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
| Prop | Valores |
|
|
216
|
+
| ------------ | ------- |
|
|
217
|
+
| `type` | `filled` \| `outline` \| `unfilled` \| `secondary` \| `ia` |
|
|
218
|
+
| `color` | `primary` \| `success` \| `attention` \| `warning` \| `new` \| `innovation` \| `blocked` \| `neutral` |
|
|
219
|
+
| `size` | `md` \| `sm` |
|
|
220
|
+
| `nativeType` | `button` \| `submit` \| `reset` (a prop `type` é o visual do ADS) |
|
|
221
|
+
|
|
222
|
+
### Campos de formulário
|
|
223
|
+
|
|
224
|
+
```vue
|
|
225
|
+
<AdsInput
|
|
226
|
+
v-model="preco"
|
|
227
|
+
label="Preço"
|
|
228
|
+
hint="Valor unitário"
|
|
229
|
+
suffix="R$"
|
|
230
|
+
type="number"
|
|
231
|
+
:error="erro"
|
|
232
|
+
/>
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Estados disponíveis via `state` (útil para documentação): `default`, `active`, `focus`, `error`, `disabled` e `ai`.
|
|
236
|
+
|
|
237
|
+
### Modal
|
|
238
|
+
|
|
239
|
+
```vue
|
|
240
|
+
<template>
|
|
241
|
+
<AdsButton label="Excluir" color="warning" @click="aberto = true" />
|
|
242
|
+
|
|
243
|
+
<AdsModal
|
|
244
|
+
v-model:open="aberto"
|
|
245
|
+
title="Excluir item"
|
|
246
|
+
description="Essa ação não pode ser desfeita."
|
|
247
|
+
cancel-label="Cancelar"
|
|
248
|
+
confirm-label="Excluir"
|
|
249
|
+
@confirm="excluir"
|
|
250
|
+
@cancel="aberto = false"
|
|
251
|
+
/>
|
|
252
|
+
</template>
|
|
253
|
+
|
|
254
|
+
<script setup lang="ts">
|
|
255
|
+
const aberto = ref(false);
|
|
256
|
+
const excluir = () => {
|
|
257
|
+
/* ... */
|
|
258
|
+
aberto.value = false;
|
|
259
|
+
};
|
|
260
|
+
</script>
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
Eventos: `confirm`, `cancel` e `dismiss` (com o motivo `"esc"` ou `"outside"`). Slots: `default`, `title` e `footer`.
|
|
264
|
+
|
|
265
|
+
### Toast
|
|
266
|
+
|
|
267
|
+
Como componente em linha:
|
|
268
|
+
|
|
269
|
+
```vue
|
|
270
|
+
<AdsToast status="success" title="Tudo certo" message="Alterações salvas." />
|
|
271
|
+
<AdsToast status="error" message="Falha ao salvar." action-label="Tentar novamente" />
|
|
272
|
+
<AdsToast appearance="status" status="neutral" title="Relatório" subtitle="Explicação opcional" />
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
Como toast flutuante, usando o `useToast` do Nuxt UI (as cores de status e os ícones do ADS são aplicados automaticamente pelo plugin da layer):
|
|
276
|
+
|
|
277
|
+
```ts
|
|
278
|
+
const toast = useToast();
|
|
279
|
+
|
|
280
|
+
toast.add({
|
|
281
|
+
title: "Salvo",
|
|
282
|
+
description: "Suas alterações foram salvas.",
|
|
283
|
+
color: "success",
|
|
284
|
+
});
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Pílulas e badges
|
|
288
|
+
|
|
289
|
+
```vue
|
|
290
|
+
<AdsPill status="success" label="Ativo" />
|
|
291
|
+
<AdsPill status="warning" tone="secondary" label="Atrasado" icon="i-lucide-alert-triangle" />
|
|
292
|
+
<AdsBadge color="primary" :value="5" />
|
|
293
|
+
<AdsBadge color="warning" mini />
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Paginação e abas
|
|
297
|
+
|
|
298
|
+
```vue
|
|
299
|
+
<AdsPagination v-model:page="pagina" :total-pages="20" />
|
|
300
|
+
|
|
301
|
+
<AdsTabs v-model="aba" :items="itens" />
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### Tabela
|
|
305
|
+
|
|
306
|
+
```vue
|
|
307
|
+
<AdsTable
|
|
308
|
+
:data="linhas"
|
|
309
|
+
:columns="colunas"
|
|
310
|
+
density="md"
|
|
311
|
+
striped
|
|
312
|
+
:loading="carregando"
|
|
313
|
+
empty-label="Nenhum resultado encontrado"
|
|
314
|
+
/>
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
Para montar colunas, a layer exporta helpers em `app/utils/ads-table.ts`, como `adsTableColumn`, `adsTablePinned`, `adsTableGroup`, `adsTableVariationClass` e `adsTableTreeIndent`.
|
|
318
|
+
|
|
319
|
+
### Seletor de datas
|
|
320
|
+
|
|
321
|
+
```vue
|
|
322
|
+
<!-- Data única -->
|
|
323
|
+
<AdsDatePicker v-model="data" min="2026-01-01" />
|
|
324
|
+
|
|
325
|
+
<!-- Intervalo (máximo de 31 dias) -->
|
|
326
|
+
<AdsDatePicker range v-model:start="inicio" v-model:end="fim" :maximum-days="31" />
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
As datas trafegam como string `YYYY-MM-DD`.
|
|
330
|
+
|
|
331
|
+
## Tokens de design
|
|
332
|
+
|
|
333
|
+
Os tokens vêm do Figma do ADS e estão organizados em três camadas:
|
|
334
|
+
|
|
335
|
+
1. **Primitivos** — valores brutos (escalas de cor, espaçamentos).
|
|
336
|
+
2. **Semânticos** — intenção de uso (`--ads-surface-*`, `--ads-text-*`, `--ads-border-*`, `--ads-status-*`).
|
|
337
|
+
3. **De componente** — ajustes finos por componente (`--ads-button-*`, `--ads-modal-*`, `--ads-tooltip-*`…).
|
|
338
|
+
|
|
339
|
+
### Variáveis CSS
|
|
340
|
+
|
|
341
|
+
```css
|
|
342
|
+
.meu-card {
|
|
343
|
+
background: var(--ads-surface-main);
|
|
344
|
+
color: var(--ads-text-secondary);
|
|
345
|
+
border-radius: var(--ads-button-radius);
|
|
346
|
+
box-shadow: var(--ads-shadow-level-3);
|
|
347
|
+
}
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### Classes Tailwind
|
|
351
|
+
|
|
352
|
+
As variáveis semânticas também estão mapeadas como cores do Tailwind (`--color-ads-*`):
|
|
353
|
+
|
|
354
|
+
```html
|
|
355
|
+
<div class="bg-ads-surface-main border-ads-border-width-thin"></div>
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### Escalas de cor
|
|
359
|
+
|
|
360
|
+
| Escala | Uso |
|
|
361
|
+
| ------------------ | --- |
|
|
362
|
+
| `primary` / `secondary` | Azul do Radar Pricing, de 50 a 950 (base `#006ff7`). |
|
|
363
|
+
| `success` | Verde de sucesso (base `#15c57e`). |
|
|
364
|
+
| Neutros | `neutralLight`, `neutralMid` e `neutralDark`. |
|
|
365
|
+
| Status | `success`, `attention`, `warning`, `new`, `innovation`, `blocked`. |
|
|
366
|
+
|
|
367
|
+
### Espaçamento
|
|
368
|
+
|
|
369
|
+
| Token | px | Token | px | Token | px |
|
|
370
|
+
| ------ | --- | ------ | --- | ------ | --- |
|
|
371
|
+
| quark | 4 | sm | 32 | xxxl | 120 |
|
|
372
|
+
| nano | 8 | rg | 40 | huge | 160 |
|
|
373
|
+
| xxxs | 12 | md | 48 | giant | 200 |
|
|
374
|
+
| xxs | 16 | lg | 56 | | |
|
|
375
|
+
| xs | 24 | xl / xxl | 64 / 80 | | |
|
|
376
|
+
|
|
377
|
+
Os mesmos valores estão disponíveis em TypeScript, em `app/theme/ads-tokens.ts` (`adsSpacing`, `adsRadarPricing`, `adsRadarBase`, `adsNeutralLight`, `adsNeutralMid`, `adsNeutralDark`, `adsSuccess`…).
|
|
378
|
+
|
|
379
|
+
### Personalizando tokens de componente
|
|
380
|
+
|
|
381
|
+
Os tokens de componente são gerados a partir de `app/theme/component-tokens.json` para `component-tokens.css`. Para ajustar no seu projeto sem editar o pacote, sobrescreva a variável CSS depois do CSS da layer:
|
|
382
|
+
|
|
383
|
+
```css
|
|
384
|
+
:root {
|
|
385
|
+
--ads-button-radius: 4px;
|
|
386
|
+
--ads-button-primary: #0050b3;
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
## Tema do Nuxt UI
|
|
391
|
+
|
|
392
|
+
O `app.config.ts` da layer customiza os seguintes componentes do Nuxt UI para seguir o ADS:
|
|
393
|
+
|
|
394
|
+
`button`, `input`, `inputDate`, `calendar`, `select`, `selectMenu`, `toast`, `toaster` e `tooltip`.
|
|
395
|
+
|
|
396
|
+
Por ser uma layer, você pode estender ou sobrescrever no `app.config.ts` do seu projeto:
|
|
397
|
+
|
|
398
|
+
```ts
|
|
399
|
+
// app/app.config.ts
|
|
400
|
+
export default defineAppConfig({
|
|
401
|
+
ui: {
|
|
402
|
+
button: {
|
|
403
|
+
slots: {
|
|
404
|
+
base: "rounded-md",
|
|
405
|
+
},
|
|
406
|
+
},
|
|
407
|
+
},
|
|
408
|
+
});
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
## Composables
|
|
412
|
+
|
|
413
|
+
### `useOverlayLoading`
|
|
414
|
+
|
|
415
|
+
Exibe um overlay de tela cheia para carregamento, sucesso, erro, busca ou informação, com barra de progresso opcional.
|
|
416
|
+
|
|
417
|
+
```ts
|
|
418
|
+
const overlay = useOverlayLoading();
|
|
419
|
+
|
|
420
|
+
overlay.show({
|
|
421
|
+
variant: "loading",
|
|
422
|
+
title: "Processando",
|
|
423
|
+
description: "Isso pode levar alguns segundos.",
|
|
424
|
+
showProgress: true,
|
|
425
|
+
progress: 10,
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
overlay.update({ progress: 60 });
|
|
429
|
+
|
|
430
|
+
overlay.update({ variant: "success", title: "Concluído!" });
|
|
431
|
+
|
|
432
|
+
overlay.close();
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
| Método | Descrição |
|
|
436
|
+
| ----------------- | --------- |
|
|
437
|
+
| `show(options)` | Abre o overlay (fecha o anterior, se houver) e retorna o id. |
|
|
438
|
+
| `update(options)` | Mescla novas props no overlay aberto. |
|
|
439
|
+
| `close()` | Fecha o overlay. |
|
|
440
|
+
| `isOpen()` | Indica se há overlay aberto. |
|
|
441
|
+
| `getCurrentId()` | Retorna o id do overlay atual. |
|
|
442
|
+
|
|
443
|
+
Opções (`OverlayLoadingOptions`):
|
|
444
|
+
|
|
445
|
+
| Opção | Tipo |
|
|
446
|
+
| ----------------- | ---- |
|
|
447
|
+
| `variant` | `"loading"` \| `"success"` \| `"error"` \| `"search"` \| `"info"` |
|
|
448
|
+
| `title`, `description`, `hint` | `string` |
|
|
449
|
+
| `showProgress`, `progress` | `boolean`, `number` |
|
|
450
|
+
| `iconSrc` | `string` |
|
|
451
|
+
| `actionLabel`, `onAction` | rótulo e callback de ação |
|
|
452
|
+
| `onUserClose` | callback ao usuário fechar |
|
|
453
|
+
| `closableVariants`| `("success" \| "error")[]` — variantes que o usuário pode fechar |
|
|
454
|
+
|
|
455
|
+
## Utilitários
|
|
456
|
+
|
|
457
|
+
Todos ficam em `app/utils` e são auto-importados pelo Nuxt.
|
|
458
|
+
|
|
459
|
+
| Arquivo | Funções principais |
|
|
460
|
+
| --------------------- | ------------------ |
|
|
461
|
+
| `money.ts` | `numberToBRL`, `numberToCompactBRL`, `parseStringMoneyToFloat`, `formatPriceInput`, `parsePriceInput` |
|
|
462
|
+
| `percentage.ts` | `formatPercentage`, `formatPercentageWithDecimals`, `formatPercentagePtBr` |
|
|
463
|
+
| `parser.ts` | `parseToPercentage`, `parsePercentageToFloat`, `getTodayDateString`, `formatDateOnlyToPtBr`, `formatDateToPtBr`, `daysBetweenDateOnly`, `daysFromTodayToDateOnly`, `normalizePercentage` |
|
|
464
|
+
| `calendar-date.ts` | Conversão entre `string` e `CalendarDate` (`@internationalized/date`) e helpers de intervalo |
|
|
465
|
+
| `notability.ts` | `formatNotability` |
|
|
466
|
+
| `category-role.ts` | `CATEGORY_ROLES`, `formatCategoryRole`, `parseCategoryRole` |
|
|
467
|
+
| `ads-filter-select.ts`| Helpers para `AdsFilterSelect` (agrupamento, seleção, rótulos, meses) |
|
|
468
|
+
| `ads-table.ts` | Helpers e tipos para `AdsTable` |
|
|
469
|
+
|
|
470
|
+
```ts
|
|
471
|
+
numberToBRL(1234.5); // "R$ 1.234,50"
|
|
472
|
+
numberToBRL(-10); // "R$ -10,00"
|
|
473
|
+
numberToBRL(null); // "-"
|
|
474
|
+
numberToCompactBRL(2_500_000); // valor compacto em milhões
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
## Localização (pt-BR)
|
|
478
|
+
|
|
479
|
+
A layer inclui `app/locale/pt-br.ts`, que exporta o locale do Nuxt UI para português do Brasil (calendário, meses e rótulos):
|
|
480
|
+
|
|
481
|
+
```ts
|
|
482
|
+
import { uiLocale, UI_LOCALE_CODE } from "ads-nuxt/app/locale/pt-br";
|
|
483
|
+
// UI_LOCALE_CODE === "pt-BR"
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
Passe-o ao `UApp` como mostrado em [Configuração](#configuração).
|
|
487
|
+
|
|
488
|
+
## Desenvolvimento
|
|
489
|
+
|
|
490
|
+
Este repositório usa **pnpm** e contém um **playground** Nuxt com a documentação interativa dos componentes e dos tokens.
|
|
491
|
+
|
|
492
|
+
```bash
|
|
493
|
+
git clone https://github.com/jbfarmarcas/alquimia-design-system.git
|
|
494
|
+
cd alquimia-design-system
|
|
495
|
+
pnpm install
|
|
496
|
+
|
|
497
|
+
pnpm dev # playground em http://localhost:3010
|
|
498
|
+
pnpm build # build do playground
|
|
499
|
+
pnpm preview # preview do build
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
Páginas do playground:
|
|
503
|
+
|
|
504
|
+
| Rota | Conteúdo |
|
|
505
|
+
| ------------------------- | -------- |
|
|
506
|
+
| `/design-system` | Catálogo de componentes com demos e código |
|
|
507
|
+
| `/design-system/tabelas` | Variações de tabela |
|
|
508
|
+
| `/design-system/tokens` | Editor visual dos tokens de componente |
|
|
509
|
+
|
|
510
|
+
### Docker
|
|
511
|
+
|
|
512
|
+
```bash
|
|
513
|
+
docker compose up
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
### Publicação
|
|
517
|
+
|
|
518
|
+
O pacote publica apenas `app/` e `nuxt.config.ts` (campo `files`), com acesso público:
|
|
519
|
+
|
|
520
|
+
```bash
|
|
521
|
+
pnpm publish
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
## Estrutura do projeto
|
|
525
|
+
|
|
526
|
+
```
|
|
527
|
+
.
|
|
528
|
+
├── app/ # Conteúdo publicado no npm (a layer)
|
|
529
|
+
│ ├── app.config.ts # Tema do Nuxt UI
|
|
530
|
+
│ ├── assets/ # CSS, SVGs de marca e animações
|
|
531
|
+
│ ├── components/ # Componentes Ads*
|
|
532
|
+
│ ├── composables/ # useOverlayLoading
|
|
533
|
+
│ ├── constants/ # Constantes (swatches de cor)
|
|
534
|
+
│ ├── locale/ # Locale pt-BR
|
|
535
|
+
│ ├── plugins/ # Plugin de toast
|
|
536
|
+
│ ├── theme/ # Tokens e temas (TS/JSON)
|
|
537
|
+
│ ├── types/ # Tipos compartilhados
|
|
538
|
+
│ └── utils/ # Utilitários de formatação e helpers
|
|
539
|
+
├── playground/ # App de documentação (não publicado)
|
|
540
|
+
├── nuxt.config.ts # Entrada da layer
|
|
541
|
+
└── package.json
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
## Licença
|
|
545
|
+
|
|
546
|
+
[MIT](./LICENSE) © 2026 Farmarcas
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ads-nuxt",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Alquimia Design System para Nuxt, construído sobre Nuxt UI",
|
|
6
6
|
"repository": {
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"dev": "nuxt dev playground --port 3010",
|
|
22
22
|
"build": "nuxt build playground",
|
|
23
23
|
"preview": "nuxt preview playground --port 3010",
|
|
24
|
-
"
|
|
24
|
+
"prepare": "nuxt prepare playground"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@iconify-json/lucide": "^1.2.104",
|