@topjoao/top-design-system 0.1.8 → 0.2.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 CHANGED
@@ -1,36 +1,37 @@
1
1
  # TopSolutions Design System
2
2
 
3
3
  Biblioteca de componentes Vue 3, estilos e tokens visuais compartilhados pela
4
- TopSolutions.
5
-
6
- ## Índice
7
-
8
- - [Instalação e configuração](#instalação)
9
- - [Tema e tokens](#tema-topsolutions)
10
- - [Integração com Nuxt e Vue 3](#uso-com-nuxt)
11
- - [Componentes](#componentes-publicos)
12
- - [Tipos e exports públicos](#tipos-e-exports-públicos)
13
- - [Desenvolvimento da biblioteca](#desenvolvimento-da-biblioteca)
14
-
15
- ## Componentes públicos
16
-
17
- | Componente | Finalidade | `v-model` |
18
- |---|---|---|
19
- | `TopButton` | Botão com estilos e estados da marca. | — |
20
- | `TopConfirmDialog` | Confirmação modal controlada pela aplicação. | `boolean` |
21
- | `TopDatePicker` | Campo de data, múltiplas datas ou intervalo. | `Date`/array de `Date` |
22
- | `TopFileUpload` | Escolha, validação e prévia de arquivos; não faz upload. | `File`/`File[]`/`null` |
23
- | `TopInputText` | Campo textual com label, erro e acessibilidade. | `string` |
24
- | `TopInputNumber` | Campo numérico localizado, com moeda, limites e incrementos. | `number \| null` |
25
- | `TopNavBar` | Navegação responsiva, breadcrumbs, favoritos e Drawer. | `searchValue` e `mobileOpen` opcionais |
26
- | `TopSelect` | Autocomplete pesquisável com paginação virtual. | opção/opções |
27
- | `TopTabs` | Abas com painéis nomeados. | `string \| number` |
28
- | `TopToast` | Renderizador de notificações do serviço Toast do PrimeVue. | — |
4
+ TopSolutions.
5
+
6
+ ## Índice
7
+
8
+ - [Instalação e configuração](#instalação)
9
+ - [Tema e tokens](#tema-topsolutions)
10
+ - [Integração com Nuxt e Vue 3](#uso-com-nuxt)
11
+ - [Componentes](#componentes-publicos)
12
+ - [Tipos e exports públicos](#tipos-e-exports-públicos)
13
+ - [Desenvolvimento da biblioteca](#desenvolvimento-da-biblioteca)
14
+
15
+ ## Componentes públicos
16
+
17
+ | Componente | Finalidade | `v-model` |
18
+ |---|---|---|
19
+ | `TopButton` | Botão com estilos e estados da marca. | — |
20
+ | `TopConfirmDialog` | Confirmação modal controlada pela aplicação. | `boolean` |
21
+ | `TopDatePicker` | Campo de data, múltiplas datas ou intervalo. | `Date`/array de `Date` |
22
+ | `TopFileUpload` | Escolha, validação e prévia de arquivos; não faz upload. | `File`/`File[]`/`null` |
23
+ | `TopInputText` | Campo textual com label, erro e acessibilidade. | `string` |
24
+ | `TopTextArea` | Campo de texto multilinha com label, erro e altura configurável. | `string` |
25
+ | `TopInputNumber` | Campo numérico localizado, com moeda, limites e incrementos. | `number \| null` |
26
+ | `TopNavBar` | Navegação responsiva, breadcrumbs, favoritos e Drawer. | `searchValue` e `mobileOpen` opcionais |
27
+ | `TopSelect` | Autocomplete pesquisável com paginação virtual. | opção/opções |
28
+ | `TopTabs` | Abas com painéis nomeados. | `string \| number` |
29
+ | `TopToast` | Renderizador de notificações do serviço Toast do PrimeVue. | — |
29
30
 
30
31
  ## Instalação
31
32
 
32
33
  ```bash
33
- npm install @topjoao/top-design-system
34
+ npm install @topjoao/top-design-system
34
35
  ```
35
36
 
36
37
  A aplicação consumidora deve possuir Vue 3, PrimeVue, PrimeIcons e
@@ -45,24 +46,24 @@ oficial da TopSolutions. Configure-o uma vez na aplicação consumidora:
45
46
  import PrimeVue from 'primevue/config'
46
47
  import { TopSolutionsPreset } from '@topjoao/top-design-system'
47
48
 
48
- app.use(PrimeVue, {
49
- theme: {
50
- preset: TopSolutionsPreset,
51
- options: {
52
- darkModeSelector: '.dark',
53
- cssLayer: {
54
- name: 'primevue',
55
- order: 'primevue',
56
- },
57
- },
58
- },
59
- })
60
- ```
61
-
62
- A camada `primevue` mantém os estilos estruturais do tema abaixo dos padrões do
63
- Design System e das classes utilitárias da aplicação. Com isso, propriedades
64
- como `headerClass` e `contentClass` conseguem sobrescrever os valores padrão sem
65
- `!important`.
49
+ app.use(PrimeVue, {
50
+ theme: {
51
+ preset: TopSolutionsPreset,
52
+ options: {
53
+ darkModeSelector: '.dark',
54
+ cssLayer: {
55
+ name: 'primevue',
56
+ order: 'primevue',
57
+ },
58
+ },
59
+ },
60
+ })
61
+ ```
62
+
63
+ A camada `primevue` mantém os estilos estruturais do tema abaixo dos padrões do
64
+ Design System e das classes utilitárias da aplicação. Com isso, propriedades
65
+ como `headerClass` e `contentClass` conseguem sobrescrever os valores padrão sem
66
+ `!important`.
66
67
 
67
68
  Para ativar o modo escuro, adicione ou remova `.dark` uma única vez no elemento
68
69
  `<html>` da aplicação. Os componentes usam tokens semânticos de superfície, texto e
@@ -269,16 +270,16 @@ sendo explorado recebem destaque.
269
270
  | `showAia`, `showSupport` | `boolean` / `false` | Exibem as ações opcionais. |
270
271
  | `aiaActive` | `boolean` / `false` | Estado visual do botão Aia. |
271
272
  | `aiaLabel`, `supportLabel` | `string` | Textos acessíveis e rótulos do Drawer. |
272
- | `actions` | `TopNavAction[]` / `[]` | Ações genéricas, como integrações, emitidas por `action`. |
273
- | `client` | `TopNavClient` | Organização, cliente ou escopo ativo exibido no cabeçalho e como contexto do usuário no rodapé do Drawer; não cria ação nem seletor. |
274
- | `user` | `TopNavUser` | Dados exclusivamente visuais do usuário. |
273
+ | `actions` | `TopNavAction[]` / `[]` | Ações genéricas, como integrações, emitidas por `action`. |
274
+ | `client` | `TopNavClient` | Organização, cliente ou escopo ativo exibido no cabeçalho e como contexto do usuário no rodapé do Drawer; não cria ação nem seletor. |
275
+ | `user` | `TopNavUser` | Dados exclusivamente visuais do usuário. |
275
276
  | `userMenuItems` | `TopNavUserMenuItem[]` | Opções emitidas por `user-action`; suporta separadores. |
276
277
  | `favoriteItems` | `TopNavItem[]` / `[]` | Favoritos fornecidos pelo pai para dropdown e Drawer. |
277
278
  | `showFavoriteToggle` | `boolean` / `false` | Exibe a estrela da página atual. |
278
279
  | `favoriteActive` | `boolean` / `false` | Estado visual da estrela atual. |
279
- | `mobileOpen` | `boolean` | Controle opcional com `v-model:mobile-open`. |
280
- | `appearance` | `TopNavBarAppearance` | Tokens visuais locais descritos abaixo. |
281
- | `spacing` | `TopNavBarSpacing` | Espaçamento do conteúdo no cabeçalho e breadcrumbs; preserva os padrões atuais quando omitido. |
280
+ | `mobileOpen` | `boolean` | Controle opcional com `v-model:mobile-open`. |
281
+ | `appearance` | `TopNavBarAppearance` | Tokens visuais locais descritos abaixo. |
282
+ | `spacing` | `TopNavBarSpacing` | Espaçamento do conteúdo no cabeçalho e breadcrumbs; preserva os padrões atuais quando omitido. |
282
283
 
283
284
  ### Eventos
284
285
 
@@ -303,7 +304,7 @@ atalho abre primeiro o Drawer e foca a busca móvel. `Escape` fecha os painéis.
303
304
  | Slot | Uso |
304
305
  |---|---|
305
306
  | `brand` | Marca; recebe `{ compact }`. |
306
- | `context`, `scope` ou `client` | Contexto operacional; aliases com prioridade nessa ordem, recebem `{ client, compact }`. O slot `client` substitui a apresentação padrão da prop `client`. |
307
+ | `context`, `scope` ou `client` | Contexto operacional; aliases com prioridade nessa ordem, recebem `{ client, compact }`. O slot `client` substitui a apresentação padrão da prop `client`. |
307
308
  | `context-compact` | Variante explícita usada no último estágio de overflow. |
308
309
  | `actions` | Conteúdo adicional do cabeçalho; recebe `{ compact, close }`. |
309
310
  | `aia-icon`, `support-icon` | Ícones customizados das ações quadradas. |
@@ -317,53 +318,53 @@ atalho abre primeiro o Drawer e foca a busca móvel. `Escape` fecha os painéis.
317
318
  | `drawer-actions` | Ações; recebe `{ actions, select, close }`. |
318
319
  | `drawer-before-menu`, `drawer-after-menu` | Conteúdo antes/depois do trilho rolável. |
319
320
  | `drawer-menu` | Substitui a árvore; recebe `{ sections, select, close }`. |
320
- | `drawer-user` | Rodapé de usuário; recebe `{ user, client, open, toggle }`. |
321
- | `drawer-footer` | Conteúdo final adicional; recebe `{ close }`. |
322
-
323
- ### Faixa de favoritos
324
-
325
- No desktop, `favoriteItems` aparece primeiro em uma faixa horizontal abaixo dos
326
- breadcrumbs. A biblioteca mede uma cópia invisível da faixa com
327
- `ResizeObserver`: se a largura real não couber, ela é substituída pelo dropdown
328
- `Favoritos`. O mesmo dropdown é usado depois que a página passa de `120px` de
329
- scroll e a faixa retorna apenas ao chegar a `24px` ou menos. Os valores evitam
330
- oscilações perto do topo e reproduzem o comportamento do AppSidebar.
331
-
332
- ### Aparência e responsividade
333
-
334
- Use `spacing` para criar uma zona segura horizontal sem limitar o fundo das
335
- duas faixas. Os valores são aplicados no elemento raiz como
336
- `--top-nav-header-padding` e `--top-nav-breadcrumb-padding`; o cabeçalho e o
337
- breadcrumb continuam ocupando toda a largura da viewport.
338
- Em telas móveis, esses valores também são usados, salvo se a aplicação já
339
- definir as variáveis específicas `--top-nav-header-padding-mobile` ou
340
- `--top-nav-breadcrumb-padding-mobile`.
341
-
342
- ```vue
343
- <TopNavBar
344
- :spacing="{
345
- headerPadding: '0.625rem max(2rem, calc((100vw - 80rem) / 2 + 2rem))',
346
- breadcrumbPadding: '0.25rem max(2rem, calc((100vw - 80rem) / 2 + 2rem))',
347
- }"
348
- />
349
- ```
350
-
351
- `appearance` é propositalmente pequeno e semântico. Use `colors` para
352
- `navigation`, `text`, `mutedText`, `accent`, `border`, `menuText`,
353
- `mobileActiveText` e `favoritesText`; `surfaces` para `breadcrumb`, `drawer`,
354
- `drawerFooter`, `menu`, `menuHover`, `menuExplored`, `mobileActive`,
355
- `favorites` e `currentPage`; `borders` para `menu` (a borda externa de 6px),
356
- `menuOutline`, `mobileDivider`, `favorites` e `currentPage`; `shape` para
357
- `radius`, `drawerRadius`, `shadow` e `favoritesShadow`; e `focus` para
358
- `onDark` e `onLight`.
359
-
360
- ```ts
361
- const appearance = {
362
- colors: { navigation: '#09090b', text: '#f4f4f5', border: 'rgb(255 255 255 / 14%)' },
363
- surfaces: { drawer: '#09090b', menu: '#18181b', menuHover: '#27272a' },
364
- shape: { radius: '8px', shadow: '0 12px 30px rgb(0 0 0 / 25%)' },
365
- }
366
- ```
321
+ | `drawer-user` | Rodapé de usuário; recebe `{ user, client, open, toggle }`. |
322
+ | `drawer-footer` | Conteúdo final adicional; recebe `{ close }`. |
323
+
324
+ ### Faixa de favoritos
325
+
326
+ No desktop, `favoriteItems` aparece primeiro em uma faixa horizontal abaixo dos
327
+ breadcrumbs. A biblioteca mede uma cópia invisível da faixa com
328
+ `ResizeObserver`: se a largura real não couber, ela é substituída pelo dropdown
329
+ `Favoritos`. O mesmo dropdown é usado depois que a página passa de `120px` de
330
+ scroll e a faixa retorna apenas ao chegar a `24px` ou menos. Os valores evitam
331
+ oscilações perto do topo e reproduzem o comportamento do AppSidebar.
332
+
333
+ ### Aparência e responsividade
334
+
335
+ Use `spacing` para criar uma zona segura horizontal sem limitar o fundo das
336
+ duas faixas. Os valores são aplicados no elemento raiz como
337
+ `--top-nav-header-padding` e `--top-nav-breadcrumb-padding`; o cabeçalho e o
338
+ breadcrumb continuam ocupando toda a largura da viewport.
339
+ Em telas móveis, esses valores também são usados, salvo se a aplicação já
340
+ definir as variáveis específicas `--top-nav-header-padding-mobile` ou
341
+ `--top-nav-breadcrumb-padding-mobile`.
342
+
343
+ ```vue
344
+ <TopNavBar
345
+ :spacing="{
346
+ headerPadding: '0.625rem max(2rem, calc((100vw - 80rem) / 2 + 2rem))',
347
+ breadcrumbPadding: '0.25rem max(2rem, calc((100vw - 80rem) / 2 + 2rem))',
348
+ }"
349
+ />
350
+ ```
351
+
352
+ `appearance` é propositalmente pequeno e semântico. Use `colors` para
353
+ `navigation`, `text`, `mutedText`, `accent`, `border`, `menuText`,
354
+ `mobileActiveText` e `favoritesText`; `surfaces` para `breadcrumb`, `drawer`,
355
+ `drawerFooter`, `menu`, `menuHover`, `menuExplored`, `mobileActive`,
356
+ `favorites` e `currentPage`; `borders` para `menu` (a borda externa de 6px),
357
+ `menuOutline`, `mobileDivider`, `favorites` e `currentPage`; `shape` para
358
+ `radius`, `drawerRadius`, `shadow` e `favoritesShadow`; e `focus` para
359
+ `onDark` e `onLight`.
360
+
361
+ ```ts
362
+ const appearance = {
363
+ colors: { navigation: '#09090b', text: '#f4f4f5', border: 'rgb(255 255 255 / 14%)' },
364
+ surfaces: { drawer: '#09090b', menu: '#18181b', menuHover: '#27272a' },
365
+ shape: { radius: '8px', shadow: '0 12px 30px rgb(0 0 0 / 25%)' },
366
+ }
367
+ ```
367
368
 
368
369
  A biblioteca não fixa tipografia inline. Por padrão, família, tamanho, peso e
369
370
  altura de linha são herdados da aplicação consumidora. Além disso, `appearance`
@@ -376,33 +377,33 @@ tema global pode controlar o componente sem precisar usar `!important`:
376
377
  --top-nav-font-family: var(--app-font-family);
377
378
  --top-nav-font-size: var(--app-font-size);
378
379
  --top-nav-strong-font-weight: 600;
379
- --top-nav-action-size: 2.5rem;
380
- --top-nav-header-padding: 0.625rem 1.5rem;
381
- --top-nav-breadcrumb-padding: 0.25rem 1.5rem;
382
- --top-nav-menu-item-padding: 0.5rem 0.75rem;
380
+ --top-nav-action-size: 2.5rem;
381
+ --top-nav-header-padding: 0.625rem 1.5rem;
382
+ --top-nav-breadcrumb-padding: 0.25rem 1.5rem;
383
+ --top-nav-menu-item-padding: 0.5rem 0.75rem;
383
384
  --top-nav-section-width: 16rem;
384
385
  --top-nav-column-width: 18rem;
385
386
  --top-nav-mobile-active-bg: #fff;
386
- --top-nav-mobile-active-fg: #025a84;
387
- --top-nav-mobile-divider: rgb(255 255 255 / 20%);
388
- --top-nav-mobile-item-gap: 0.25rem;
389
- --top-nav-mobile-submenu-padding: 0.5rem 0 0.375rem 0.35rem;
390
- --top-nav-favorites-bg: #f8fafc;
391
- --top-nav-favorites-fg: #0f172a;
392
- --top-nav-favorites-border: #e2e8f0;
393
- --top-nav-favorites-shadow: 0 1px 2px rgb(15 23 42 / 6%);
394
- --top-nav-focus-ring: #dbeafe;
395
- --top-nav-focus-ring-light: #1d4ed8;
396
- --top-nav-current-bg: rgb(255 255 255 / 10%);
397
- --top-nav-current-border: rgb(255 255 255 / 15%);
398
- --top-nav-menu-scrollbar-thumb: #94a3b8;
399
- }
387
+ --top-nav-mobile-active-fg: #025a84;
388
+ --top-nav-mobile-divider: rgb(255 255 255 / 20%);
389
+ --top-nav-mobile-item-gap: 0.25rem;
390
+ --top-nav-mobile-submenu-padding: 0.5rem 0 0.375rem 0.35rem;
391
+ --top-nav-favorites-bg: #f8fafc;
392
+ --top-nav-favorites-fg: #0f172a;
393
+ --top-nav-favorites-border: #e2e8f0;
394
+ --top-nav-favorites-shadow: 0 1px 2px rgb(15 23 42 / 6%);
395
+ --top-nav-focus-ring: #dbeafe;
396
+ --top-nav-focus-ring-light: #1d4ed8;
397
+ --top-nav-current-bg: rgb(255 255 255 / 10%);
398
+ --top-nav-current-border: rgb(255 255 255 / 15%);
399
+ --top-nav-menu-scrollbar-thumb: #94a3b8;
400
+ }
400
401
  ```
401
402
 
402
- As variáveis globais também alcançam o Drawer teleportado. Use-as para ajustes
403
- estruturais — tipografia, larguras, alturas, padding e espaçamentos do menu —
404
- em vez de props no componente. Um valor passado por `appearance` tem precedência
405
- local e não altera os demais tokens do tema.
403
+ As variáveis globais também alcançam o Drawer teleportado. Use-as para ajustes
404
+ estruturais — tipografia, larguras, alturas, padding e espaçamentos do menu —
405
+ em vez de props no componente. Um valor passado por `appearance` tem precedência
406
+ local e não altera os demais tokens do tema.
406
407
 
407
408
  O breakpoint móvel é `1024px`. No desktop, um `ResizeObserver` reaplica a mesma
408
409
  sequência progressiva do AppSidebar: ações colapsam abaixo de `1440px`, busca
@@ -411,15 +412,15 @@ conteúdo ainda transbordar, o contexto recebe `compact: true`. O último estág
411
412
  também limita o contêiner do contexto a `3.25rem`; use `context-compact` quando
412
413
  quiser controlar exatamente o que permanece visível.
413
414
 
414
- Abaixo de `1024px`, a navegação desktop desaparece e o Drawer do PrimeVue assume.
415
- Ele mantém cabeçalho, busca, ações, trilho translúcido rolável, árvore recursiva,
416
- favoritos e usuário. No rodapé, a foto e o nome do usuário formam a primeira
417
- linha; o cliente atual aparece abaixo e o subtítulo do cliente recebe uma
418
- etiqueta quando houver. A transição `menu-expand` existe somente dentro do Drawer;
419
- os dropdowns desktop abrem sem animação e suas áreas de hover incluem o espaço
420
- entre gatilho e painel. Nessa largura, os breadcrumbs deixam de rolar
421
- horizontalmente: eles quebram em linhas e o bloco da página atual ocupa sua
422
- própria linha para permanecer legível.
415
+ Abaixo de `1024px`, a navegação desktop desaparece e o Drawer do PrimeVue assume.
416
+ Ele mantém cabeçalho, busca, ações, trilho translúcido rolável, árvore recursiva,
417
+ favoritos e usuário. No rodapé, a foto e o nome do usuário formam a primeira
418
+ linha; o cliente atual aparece abaixo e o subtítulo do cliente recebe uma
419
+ etiqueta quando houver. A transição `menu-expand` existe somente dentro do Drawer;
420
+ os dropdowns desktop abrem sem animação e suas áreas de hover incluem o espaço
421
+ entre gatilho e painel. Nessa largura, os breadcrumbs deixam de rolar
422
+ horizontalmente: eles quebram em linhas e o bloco da página atual ocupa sua
423
+ própria linha para permanecer legível.
423
424
 
424
425
  ## TopButton
425
426
 
@@ -441,8 +442,8 @@ Exemplo
441
442
 
442
443
  | Prop | Tipo | Padrão |
443
444
  |---|---|---|
444
- | `tooltip` | `string` | `''` |
445
- | `tooltipClass` | `string` | `'text-xs'` |
445
+ | `tooltip` | `string` | `''` |
446
+ | `tooltipClass` | `string` | `'text-xs'` |
446
447
  | `label` | `string` | `''` |
447
448
  | `icon` | `string` | `''` |
448
449
  | `loading` | `boolean` | `false` |
@@ -454,43 +455,43 @@ Exemplo
454
455
  | `unstyled` | `boolean` | `false` |
455
456
  | `type` | `'button' \| 'submit' \| 'reset'` | `'button'` |
456
457
 
457
- O componente emite `click` sem payload. O slot nomeado `icon` não recebe
458
- parâmetros e substitui a prop `icon` — útil para SVGs, `HugeiconsIcon` ou um
459
- ícone com estado próprio. `secondary` permanece como atalho compatível para
460
- `severity="secondary"` e tem precedência sobre `severity`.
461
-
462
- O botão clicável interno expõe a classe estável `top-button__control`, que pode
463
- ser usada para customizar globalmente qualquer característica dos `TopButton`,
464
- como tipografia, cores, espaçamento, dimensões e bordas. Defina a regra no CSS
465
- global da aplicação, carregado depois do CSS do Design System:
466
-
467
- ```css
468
- .top-button__control {
469
- font-size: 0.875rem;
470
- font-weight: 600;
471
- min-height: 44px;
472
- padding: 0.75rem 1rem;
473
- border-radius: 0.5rem;
474
- }
475
- ```
476
-
477
- Em um projeto com Tailwind, a mesma regra pode usar `@apply`:
478
-
479
- ```css
480
- @layer components {
481
- .top-button__control {
482
- @apply min-h-11 rounded-lg px-4 py-3 text-sm font-semibold;
483
- }
484
- }
485
- ```
486
-
487
- A classe `top-button__control` atua no botão clicável, enquanto `top-button`
488
- atua no elemento externo que o envolve. A prop `class` continua disponível para
489
- customizar somente uma ocorrência. Algumas regras internas que usam
490
- `!important` podem exigir maior especificidade ou `!important` para serem
491
- sobrescritas.
492
-
493
- ## TopConfirmDialog
458
+ O componente emite `click` sem payload. O slot nomeado `icon` não recebe
459
+ parâmetros e substitui a prop `icon` — útil para SVGs, `HugeiconsIcon` ou um
460
+ ícone com estado próprio. `secondary` permanece como atalho compatível para
461
+ `severity="secondary"` e tem precedência sobre `severity`.
462
+
463
+ O botão clicável interno expõe a classe estável `top-button__control`, que pode
464
+ ser usada para customizar globalmente qualquer característica dos `TopButton`,
465
+ como tipografia, cores, espaçamento, dimensões e bordas. Defina a regra no CSS
466
+ global da aplicação, carregado depois do CSS do Design System:
467
+
468
+ ```css
469
+ .top-button__control {
470
+ font-size: 0.875rem;
471
+ font-weight: 600;
472
+ min-height: 44px;
473
+ padding: 0.75rem 1rem;
474
+ border-radius: 0.5rem;
475
+ }
476
+ ```
477
+
478
+ Em um projeto com Tailwind, a mesma regra pode usar `@apply`:
479
+
480
+ ```css
481
+ @layer components {
482
+ .top-button__control {
483
+ @apply min-h-11 rounded-lg px-4 py-3 text-sm font-semibold;
484
+ }
485
+ }
486
+ ```
487
+
488
+ A classe `top-button__control` atua no botão clicável, enquanto `top-button`
489
+ atua no elemento externo que o envolve. A prop `class` continua disponível para
490
+ customizar somente uma ocorrência. Algumas regras internas que usam
491
+ `!important` podem exigir maior especificidade ou `!important` para serem
492
+ sobrescritas.
493
+
494
+ ## TopConfirmDialog
494
495
 
495
496
  Diálogo de confirmação baseado no `Dialog` do PrimeVue e nos botões do Design
496
497
  System. A visibilidade é controlada por `v-model`; a aplicação consumidora
@@ -543,7 +544,9 @@ Seletor de datas baseado no `DatePicker` do PrimeVue. O valor permanece como
543
544
  `Date` (ou arrays de `Date` nos modos `multiple` e `range`); `dateFormat` altera
544
545
  somente a apresentação no campo e não converte o `v-model` para texto.
545
546
  No modo padrão (`single` com `dd/mm/yy`), a digitação recebe automaticamente a
546
- máscara brasileira `dd/mm/aaaa`.
547
+ máscara brasileira `dd/mm/aaaa`. Use `showTime` para habilitar a seleção de
548
+ horário junto à data; nesse modo, a máscara de data é desativada para permitir a
549
+ edição do horário no campo.
547
550
 
548
551
  ```vue
549
552
  <script setup lang="ts">
@@ -577,6 +580,7 @@ const dataNascimento = ref<Date | null>(null)
577
580
  | `disabled` | `boolean` | `false` |
578
581
  | `readonly` | `boolean` | `false` |
579
582
  | `selectionMode` | `'single' \| 'multiple' \| 'range'` | `'single'` |
583
+ | `showTime` | `boolean` | `false` |
580
584
  | `dateFormat` | `string` | `'dd/mm/yy'` |
581
585
  | `minDate` / `maxDate` | `Date` | `undefined` |
582
586
  | `showIcon` | `boolean` | `true` |
@@ -585,16 +589,16 @@ const dataNascimento = ref<Date | null>(null)
585
589
  | `showButtonBar` | `boolean` | `false` |
586
590
  | `appendTo` | `'body' \| 'self' \| HTMLElement` | `'body'` |
587
591
 
588
- Eventos: `update:modelValue`, `input`, `change`, `date-select`, `show`, `hide`,
589
- `today-click`, `clear-click`, `month-change`, `year-change`, `focus`, `blur` e
590
- `keydown`. Os slots do `DatePicker` do PrimeVue são repassados pelo wrapper,
591
- incluindo `date`, `header`, `footer`, `buttonbar`, `inputicon`, `dropdownicon`,
592
- `previcon` e `nexticon`.
593
-
594
- O slot `date` recebe as props de dia disponibilizadas pelo `DatePicker`; os
595
- slots de ícone recebem as props correspondentes do PrimeVue. Os slots `header`,
596
- `footer` e `buttonbar` permitem substituir essas regiões. Todos são apenas
597
- repassados: o wrapper preserva as props e o comportamento do componente-base.
592
+ Eventos: `update:modelValue`, `input`, `change`, `date-select`, `show`, `hide`,
593
+ `today-click`, `clear-click`, `month-change`, `year-change`, `focus`, `blur` e
594
+ `keydown`. Os slots do `DatePicker` do PrimeVue são repassados pelo wrapper,
595
+ incluindo `date`, `header`, `footer`, `buttonbar`, `inputicon`, `dropdownicon`,
596
+ `previcon` e `nexticon`.
597
+
598
+ O slot `date` recebe as props de dia disponibilizadas pelo `DatePicker`; os
599
+ slots de ícone recebem as props correspondentes do PrimeVue. Os slots `header`,
600
+ `footer` e `buttonbar` permitem substituir essas regiões. Todos são apenas
601
+ repassados: o wrapper preserva as props e o comportamento do componente-base.
598
602
 
599
603
  `required` adiciona o atributo nativo e o asterisco visual; a validação continua
600
604
  sob responsabilidade da aplicação. `error` ativa o estado inválido, associa a
@@ -650,123 +654,123 @@ function enviarArquivos(files: File[]) {
650
654
  | `removeLabel` | `string` | `'Remover'` |
651
655
  | `loading` | `boolean` | `false` |
652
656
 
653
- Eventos: `update:modelValue`, `select`, `change`, `remove`, `clear` e `error`.
654
- Erros de tipo, tamanho e quantidade possuem `code`, `message` e o `file`
655
- relacionado. Os slots `empty` e `preview` permitem customizar a área vazia e a
656
- pré-visualização. Os métodos `choose()` e `clear()` ficam disponíveis pela ref
657
- do componente.
658
-
659
- | Slot | Parâmetros recebidos | Uso |
660
- |---|---|---|
661
- | `empty` | `{ choose, disabled }` | Substitui a área vazia. Chame `choose()` para abrir o seletor nativo. |
662
- | `preview` | `{ file, index, url }` | Substitui a miniatura. `url` é uma object URL apenas para imagens; nos demais casos, é `''`. |
663
-
664
- ```vue
665
- <TopFileUpload ref="upload" v-model="anexos" multiple>
666
- <template #empty="{ choose, disabled }">
667
- <button type="button" :disabled="disabled" @click="choose()">Anexar documentos</button>
668
- </template>
669
- <template #preview="{ file, url }">
670
- <img v-if="url" :src="url" :alt="file.name">
671
- <span v-else>{{ file.name }}</span>
672
- </template>
673
- </TopFileUpload>
674
- ```
675
-
676
- `accept` aceita extensões (`.pdf`), MIME types (`application/pdf`) e curingas
677
- MIME (`image/*`), separados por vírgula. `maxFileSize` é contado em bytes. Em
678
- modo simples, a última seleção válida substitui a anterior; com `multiple`,
679
- arquivos válidos são acumulados sem duplicar nome, tipo e tamanho.
680
-
681
- ## TopInputNumber
682
-
683
- Campo numérico baseado no `InputNumber` do PrimeVue, com a mesma estrutura de
684
- label, erro e acessibilidade dos demais campos. Por padrão usa `pt-BR`. No modo
685
- `decimal`, o usuário informa explicitamente o separador decimal; no modo
686
- `currency`, a máscara de centavos vem habilitada e transforma `12345` em
687
- `R$ 123,45`. O `v-model` permanece sempre numérico (`number`) ou `null` quando
688
- vazio.
689
-
690
- ```vue
691
- <script setup lang="ts">
692
- import { ref } from 'vue'
693
- import { TopInputNumber } from '@topjoao/top-design-system'
694
-
695
- const quantidade = ref<number | null>(null)
696
- const valorUnitario = ref<number | null>(null)
697
- </script>
698
-
699
- <template>
700
- <TopInputNumber
701
- v-model="quantidade"
702
- label="Quantidade"
703
- :min="1"
704
- :min-fraction-digits="2"
705
- :max-fraction-digits="4"
706
- required
707
- />
708
-
709
- <TopInputNumber
710
- v-model="valorUnitario"
711
- label="Valor unitário"
712
- mode="currency"
713
- currency="BRL"
714
- :min-fraction-digits="2"
715
- :max-fraction-digits="2"
716
- />
717
- </template>
718
- ```
719
-
720
- | Prop | Tipo | Padrão | Finalidade |
721
- |---|---|---|---|
722
- | `modelValue` | `number \| null` | `null` | Valor numérico controlado. |
723
- | `label` / `placeholder` | `string` | `''` / `''` | Rótulo e texto auxiliar do campo. |
724
- | `required` | `boolean` | `false` | Asterisco visual e atributo nativo obrigatório. |
725
- | `error` | `string` | `''` | Mensagem e estado inválido. |
726
- | `invalid` | `boolean` | `false` | Força estado inválido sem mostrar mensagem. |
727
- | `disabled` / `readonly` | `boolean` | `false` / `false` | Remove interação / preserva leitura sem desabilitar. |
728
- | `locale` | `string` | `'pt-BR'` | Locale para separadores e moeda. |
729
- | `mode` | `'decimal' \| 'currency'` | `'decimal'` | Formatação decimal ou monetária. |
730
- | `currency` / `currencyDisplay` | `string` / `'symbol' \| 'code' \| 'name'` | `undefined` / `'symbol'` | Código ISO 4217 e modo de exibição da moeda. |
731
- | `currencyInputMode` | `'decimal' \| 'cents'` | `'cents'` | Controla a entrada monetária; `decimal` desliga a máscara mesmo quando `cents` é `true`. Não afeta `mode="decimal"`. |
732
- | `cents` | `boolean` | `true` | Habilita a máscara automática somente em `mode="currency"`; `false` usa o `InputNumber` padrão. |
733
- | `centsFractionDigits` | `number` | `undefined` (efetivo: `2`) | Primeira opção para definir as casas da máscara monetária. |
734
- | `currencyFractionDigits` | `number` | `undefined` | Fallback de casas da máscara, usado depois de `centsFractionDigits`. |
735
- | `useGrouping` / `format` | `boolean` | `true` / `true` | Separadores de milhar e formatação do valor. |
736
- | `minFractionDigits` / `maxFractionDigits` | `number` | `undefined` | Precisão do PrimeVue. Sem `maxFractionDigits`, o modo decimal aceita até 20 casas; a máscara monetária usa esse valor como último fallback antes de `2`. |
737
- | `min` / `max` / `step` | `number` | `undefined` / `undefined` / `1` | Limites e passo dos botões/teclado. |
738
- | `showButtons` / `buttonLayout` | `boolean` / `'stacked' \| 'horizontal' \| 'vertical'` | `false` / `'stacked'` | Exibe e organiza os controles de incremento. |
739
- | `allowEmpty` / `showClear` / `highlightOnFocus` | `boolean` | `true` / `false` / `false` | Permite limpar, mostra ícone de limpeza e seleciona valor ao focar. |
740
-
741
- Eventos: `update:modelValue` (`number | null`), `input`, `focus` e `blur`. No
742
- fluxo padrão do `InputNumber`, o componente também repassa `value-change`.
743
- Atributos adicionais, como `name`, `autocomplete`, `aria-*` e `data-*`, são
744
- repassados ao controle interno.
745
-
746
- Quando a máscara de centavos não está ativa, os slots do `InputNumber` também
747
- são repassados: `incrementbutton` e
748
- `decrementbutton` recebem `{ listeners }`; `incrementicon` e `decrementicon`
749
- substituem os ícones; `clearicon` recebe `{ clearCallback }`.
750
-
751
- Para reproduzir a digitação monetária do TopLicita, a máscara de centavos já
752
- vem ativa em `mode="currency"`. O usuário digita somente dígitos: `12345`
753
- resulta em `R$ 123,45` e o `v-model` recebe `123.45`. Para exigir a vírgula
754
- decimal digitada pelo usuário, passe `:cents="false"` ou
755
- `currency-input-mode="decimal"`.
756
- Como a máscara controla o texto enquanto o usuário digita, nesse modo os
757
- botões incrementais, o ícone de limpeza e seus slots do `InputNumber` não são
758
- renderizados.
759
-
760
- ```vue
761
- <TopInputNumber
762
- v-model="valorUnitario"
763
- label="Valor unitário"
764
- mode="currency"
765
- currency="BRL"
766
- />
767
- ```
768
-
769
- ## TopInputText
657
+ Eventos: `update:modelValue`, `select`, `change`, `remove`, `clear` e `error`.
658
+ Erros de tipo, tamanho e quantidade possuem `code`, `message` e o `file`
659
+ relacionado. Os slots `empty` e `preview` permitem customizar a área vazia e a
660
+ pré-visualização. Os métodos `choose()` e `clear()` ficam disponíveis pela ref
661
+ do componente.
662
+
663
+ | Slot | Parâmetros recebidos | Uso |
664
+ |---|---|---|
665
+ | `empty` | `{ choose, disabled }` | Substitui a área vazia. Chame `choose()` para abrir o seletor nativo. |
666
+ | `preview` | `{ file, index, url }` | Substitui a miniatura. `url` é uma object URL apenas para imagens; nos demais casos, é `''`. |
667
+
668
+ ```vue
669
+ <TopFileUpload ref="upload" v-model="anexos" multiple>
670
+ <template #empty="{ choose, disabled }">
671
+ <button type="button" :disabled="disabled" @click="choose()">Anexar documentos</button>
672
+ </template>
673
+ <template #preview="{ file, url }">
674
+ <img v-if="url" :src="url" :alt="file.name">
675
+ <span v-else>{{ file.name }}</span>
676
+ </template>
677
+ </TopFileUpload>
678
+ ```
679
+
680
+ `accept` aceita extensões (`.pdf`), MIME types (`application/pdf`) e curingas
681
+ MIME (`image/*`), separados por vírgula. `maxFileSize` é contado em bytes. Em
682
+ modo simples, a última seleção válida substitui a anterior; com `multiple`,
683
+ arquivos válidos são acumulados sem duplicar nome, tipo e tamanho.
684
+
685
+ ## TopInputNumber
686
+
687
+ Campo numérico baseado no `InputNumber` do PrimeVue, com a mesma estrutura de
688
+ label, erro e acessibilidade dos demais campos. Por padrão usa `pt-BR`. No modo
689
+ `decimal`, o usuário informa explicitamente o separador decimal; no modo
690
+ `currency`, a máscara de centavos vem habilitada e transforma `12345` em
691
+ `R$ 123,45`. O `v-model` permanece sempre numérico (`number`) ou `null` quando
692
+ vazio.
693
+
694
+ ```vue
695
+ <script setup lang="ts">
696
+ import { ref } from 'vue'
697
+ import { TopInputNumber } from '@topjoao/top-design-system'
698
+
699
+ const quantidade = ref<number | null>(null)
700
+ const valorUnitario = ref<number | null>(null)
701
+ </script>
702
+
703
+ <template>
704
+ <TopInputNumber
705
+ v-model="quantidade"
706
+ label="Quantidade"
707
+ :min="1"
708
+ :min-fraction-digits="2"
709
+ :max-fraction-digits="4"
710
+ required
711
+ />
712
+
713
+ <TopInputNumber
714
+ v-model="valorUnitario"
715
+ label="Valor unitário"
716
+ mode="currency"
717
+ currency="BRL"
718
+ :min-fraction-digits="2"
719
+ :max-fraction-digits="2"
720
+ />
721
+ </template>
722
+ ```
723
+
724
+ | Prop | Tipo | Padrão | Finalidade |
725
+ |---|---|---|---|
726
+ | `modelValue` | `number \| null` | `null` | Valor numérico controlado. |
727
+ | `label` / `placeholder` | `string` | `''` / `''` | Rótulo e texto auxiliar do campo. |
728
+ | `required` | `boolean` | `false` | Asterisco visual e atributo nativo obrigatório. |
729
+ | `error` | `string` | `''` | Mensagem e estado inválido. |
730
+ | `invalid` | `boolean` | `false` | Força estado inválido sem mostrar mensagem. |
731
+ | `disabled` / `readonly` | `boolean` | `false` / `false` | Remove interação / preserva leitura sem desabilitar. |
732
+ | `locale` | `string` | `'pt-BR'` | Locale para separadores e moeda. |
733
+ | `mode` | `'decimal' \| 'currency'` | `'decimal'` | Formatação decimal ou monetária. |
734
+ | `currency` / `currencyDisplay` | `string` / `'symbol' \| 'code' \| 'name'` | `undefined` / `'symbol'` | Código ISO 4217 e modo de exibição da moeda. |
735
+ | `currencyInputMode` | `'decimal' \| 'cents'` | `'cents'` | Controla a entrada monetária; `decimal` desliga a máscara mesmo quando `cents` é `true`. Não afeta `mode="decimal"`. |
736
+ | `cents` | `boolean` | `true` | Habilita a máscara automática somente em `mode="currency"`; `false` usa o `InputNumber` padrão. |
737
+ | `centsFractionDigits` | `number` | `undefined` (efetivo: `2`) | Primeira opção para definir as casas da máscara monetária. |
738
+ | `currencyFractionDigits` | `number` | `undefined` | Fallback de casas da máscara, usado depois de `centsFractionDigits`. |
739
+ | `useGrouping` / `format` | `boolean` | `true` / `true` | Separadores de milhar e formatação do valor. |
740
+ | `minFractionDigits` / `maxFractionDigits` | `number` | `undefined` | Precisão do PrimeVue. Sem `maxFractionDigits`, o modo decimal aceita até 20 casas; a máscara monetária usa esse valor como último fallback antes de `2`. |
741
+ | `min` / `max` / `step` | `number` | `undefined` / `undefined` / `1` | Limites e passo dos botões/teclado. |
742
+ | `showButtons` / `buttonLayout` | `boolean` / `'stacked' \| 'horizontal' \| 'vertical'` | `false` / `'stacked'` | Exibe e organiza os controles de incremento. |
743
+ | `allowEmpty` / `showClear` / `highlightOnFocus` | `boolean` | `true` / `false` / `false` | Permite limpar, mostra ícone de limpeza e seleciona valor ao focar. |
744
+
745
+ Eventos: `update:modelValue` (`number | null`), `input`, `focus` e `blur`. No
746
+ fluxo padrão do `InputNumber`, o componente também repassa `value-change`.
747
+ Atributos adicionais, como `name`, `autocomplete`, `aria-*` e `data-*`, são
748
+ repassados ao controle interno.
749
+
750
+ Quando a máscara de centavos não está ativa, os slots do `InputNumber` também
751
+ são repassados: `incrementbutton` e
752
+ `decrementbutton` recebem `{ listeners }`; `incrementicon` e `decrementicon`
753
+ substituem os ícones; `clearicon` recebe `{ clearCallback }`.
754
+
755
+ Para reproduzir a digitação monetária do TopLicita, a máscara de centavos já
756
+ vem ativa em `mode="currency"`. O usuário digita somente dígitos: `12345`
757
+ resulta em `R$ 123,45` e o `v-model` recebe `123.45`. Para exigir a vírgula
758
+ decimal digitada pelo usuário, passe `:cents="false"` ou
759
+ `currency-input-mode="decimal"`.
760
+ Como a máscara controla o texto enquanto o usuário digita, nesse modo os
761
+ botões incrementais, o ícone de limpeza e seus slots do `InputNumber` não são
762
+ renderizados.
763
+
764
+ ```vue
765
+ <TopInputNumber
766
+ v-model="valorUnitario"
767
+ label="Valor unitário"
768
+ mode="currency"
769
+ currency="BRL"
770
+ />
771
+ ```
772
+
773
+ ## TopInputText
770
774
 
771
775
  Campo textual baseado no `InputText` do PrimeVue. O `v-model` é sempre
772
776
  `string`, inclusive para códigos, documentos e identificadores compostos
@@ -796,6 +800,7 @@ const codigo = ref('001234')
796
800
  | Prop | Tipo | Padrão |
797
801
  |---|---|---|
798
802
  | `modelValue` | `string` | `''` |
803
+ | `type` | `string` | `'text'` |
799
804
  | `label` | `string` | `''` |
800
805
  | `placeholder` | `string` | `''` |
801
806
  | `required` | `boolean` | `false` |
@@ -806,6 +811,52 @@ const codigo = ref('001234')
806
811
  Atributos e eventos nativos adicionais, como `name`, `maxlength`,
807
812
  `autocomplete`, `inputmode`, `pattern`, `aria-*`, `data-*`, `focus` e `blur`,
808
813
  são repassados ao elemento `input` interno.
814
+ Use `type="email"` ou `type="password"` para os respectivos campos.
815
+
816
+ ## TopTextArea
817
+
818
+ Campo multilinha baseado no `Textarea` do PrimeVue. O `v-model` é uma `string`
819
+ e preserva quebras de linha. A altura inicial é definida por `rows`; ative
820
+ `autoResize` para acompanhar o conteúdo digitado. Por padrão, o usuário pode
821
+ redimensionar o campo apenas na vertical; com `autoResize`, a altura é controlada
822
+ automaticamente pelo componente.
823
+
824
+ ```vue
825
+ <script setup lang="ts">
826
+ import { ref } from 'vue'
827
+ import { TopTextArea } from '@topjoao/top-design-system'
828
+
829
+ const descricao = ref('')
830
+ </script>
831
+
832
+ <template>
833
+ <TopTextArea
834
+ id="descricao"
835
+ v-model="descricao"
836
+ label="Descrição"
837
+ placeholder="Descreva o item"
838
+ :rows="5"
839
+ maxlength="500"
840
+ required
841
+ />
842
+ </template>
843
+ ```
844
+
845
+ | Prop | Tipo | Padrão |
846
+ |---|---|---|
847
+ | `modelValue` | `string` | `''` |
848
+ | `label` | `string` | `''` |
849
+ | `placeholder` | `string` | `''` |
850
+ | `required` | `boolean` | `false` |
851
+ | `error` | `string` | `''` |
852
+ | `disabled` | `boolean` | `false` |
853
+ | `readonly` | `boolean` | `false` |
854
+ | `rows` | `number` | `4` |
855
+ | `autoResize` | `boolean` | `false` |
856
+
857
+ Atributos e eventos nativos adicionais, como `name`, `maxlength`, `aria-*`,
858
+ `data-*`, `focus` e `blur`, são repassados ao elemento `textarea` interno.
859
+ `error` ativa o estado inválido e associa a mensagem ao campo por ARIA.
809
860
 
810
861
  ## TopSelect
811
862
 
@@ -847,43 +898,43 @@ function searchCustomers({ query }: { query: string }) {
847
898
  </template>
848
899
  ```
849
900
 
850
- | Prop | Tipo | Padrão |
851
- |---|---|---|
852
- | `modelValue` | `SelectOption \| SelectOption[] \| null` | `null` |
853
- | `options` | `array` | `[]` |
901
+ | Prop | Tipo | Padrão |
902
+ |---|---|---|
903
+ | `modelValue` | `SelectOption \| SelectOption[] \| null` | `null` |
904
+ | `options` | `array` | `[]` |
854
905
  | `optionLabel` | `string \| function` | `'label'` |
855
906
  | `optionKey` | `string` | `'id'` |
856
907
  | `optionPrefix` | `string` | `''` |
857
908
  | `showOptionPrefix` | `boolean` | `false` |
858
909
  | `showSelectedPrefix` | `boolean` | `false` |
859
910
  | `loading` / `disabled` / `invalid` | `boolean` | `false` |
860
- | `placeholder` | `string` | `'Pesquisar...'` |
911
+ | `placeholder` | `string` | `'Pesquisar...'` |
861
912
  | `minQueryLength` | `number` | `1` |
862
913
  | `multiple` / `forceSelection` | `boolean` | `false` / `true` |
863
914
  | `panelWidth` / `scrollHeight` | `string` | `null` / `'250px'` |
864
- | `emptyMessage` / `loadingMessage` | `string` | `'Nenhum resultado encontrado.'` / `'Carregando...'` |
915
+ | `emptyMessage` / `loadingMessage` | `string` | `'Nenhum resultado encontrado.'` / `'Carregando...'` |
865
916
  | `closeOnSelect` | `boolean` | `false` |
866
917
 
867
918
  Eventos: `update:modelValue`, `search`, `loadMore`, `clear`, `select` e
868
919
  `change`.
869
920
 
870
- Slots: `icon`, `option`, `selected-item`, `chip`, `empty`, `option-group` e
871
- `footer`. O slot `icon` recebe `loading`; sem ele, o componente mostra uma lupa
872
- ou um indicador de carregamento. Quando um slot não é informado, o componente usa sua apresentação padrão.
873
- O texto das opções é limitado visualmente pela largura disponível do painel,
874
- sem corte por quantidade fixa de caracteres; o tooltip padrão exibe o valor
875
- completo quando `showTooltip` está ativo.
876
-
877
- | Slot | Parâmetros recebidos | Uso |
878
- |---|---|---|
879
- | `icon` | `{ loading }` | Ícone à esquerda do campo. |
880
- | `option` | Props nativas, mais `{ option, label, prefix, query }` | Linha de uma opção. |
881
- | `selected-item` | Props nativas, incluindo `item` | Valor único escolhido. |
882
- | `chip` | Props nativas, incluindo `value` e `removeCallback` | Tag no modo múltiplo. |
883
- | `empty` | — | Conteúdo quando não há opções; também substitui o loading padrão. |
884
- | `option-group` | Props nativas, incluindo `option` | Cabeçalho de um grupo. |
885
- | `footer` | Props nativas do AutoComplete | Rodapé do painel. |
886
-
921
+ Slots: `icon`, `option`, `selected-item`, `chip`, `empty`, `option-group` e
922
+ `footer`. O slot `icon` recebe `loading`; sem ele, o componente mostra uma lupa
923
+ ou um indicador de carregamento. Quando um slot não é informado, o componente usa sua apresentação padrão.
924
+ O texto das opções é limitado visualmente pela largura disponível do painel,
925
+ sem corte por quantidade fixa de caracteres; o tooltip padrão exibe o valor
926
+ completo quando `showTooltip` está ativo.
927
+
928
+ | Slot | Parâmetros recebidos | Uso |
929
+ |---|---|---|
930
+ | `icon` | `{ loading }` | Ícone à esquerda do campo. |
931
+ | `option` | Props nativas, mais `{ option, label, prefix, query }` | Linha de uma opção. |
932
+ | `selected-item` | Props nativas, incluindo `item` | Valor único escolhido. |
933
+ | `chip` | Props nativas, incluindo `value` e `removeCallback` | Tag no modo múltiplo. |
934
+ | `empty` | — | Conteúdo quando não há opções; também substitui o loading padrão. |
935
+ | `option-group` | Props nativas, incluindo `option` | Cabeçalho de um grupo. |
936
+ | `footer` | Props nativas do AutoComplete | Rodapé do painel. |
937
+
887
938
  `search` recebe `{ originalEvent, query }` nas consultas digitadas e quando o
888
939
  botão abre o dropdown sem opções carregadas; se já houver opções, a abertura
889
940
  pelo botão reutiliza essa lista. Atualize `options` com os resultados.
@@ -940,111 +991,111 @@ const tabs: TopTabItem[] = [
940
991
  Cada `TopTabItem` possui `value`, `label` e `disabled?`. O `value` deve ser
941
992
  único e identifica tanto a seleção quanto o slot do painel; por exemplo,
942
993
  `value: 'documentos'` utiliza `#documentos`. Cada slot recebe `tab` e `active`.
943
- O componente emite somente `update:modelValue`. Atributos adicionais, incluindo
944
- as opções de passthrough do PrimeVue, são repassados ao componente `Tabs`.
945
-
946
- ## TopToast
947
-
948
- `TopToast` personaliza o renderizador do serviço `Toast` do PrimeVue. Registre
949
- `ToastService` uma vez, renderize um único `TopToast` perto da raiz e dispare
950
- mensagens com `useToast`. Ele não recebe uma lista de mensagens por prop.
951
-
952
- ```ts
953
- // main.ts
954
- import PrimeVue from 'primevue/config'
955
- import ToastService from 'primevue/toastservice'
956
- import { createApp } from 'vue'
957
- import App from './App.vue'
958
-
959
- createApp(App).use(PrimeVue).use(ToastService).mount('#app')
960
- ```
961
-
962
- ```vue
963
- <script setup lang="ts">
964
- import { useToast } from 'primevue/usetoast'
965
- import { TopButton, TopToast } from '@topjoao/top-design-system'
966
-
967
- const toast = useToast()
968
- const abrirCadastro = () => { /* navegue para o cadastro */ }
969
-
970
- function salvar() {
971
- toast.add({
972
- severity: 'success', summary: 'Cadastro concluído', detail: 'As alterações foram salvas.', life: 5000,
973
- data: {
974
- footer: 'Protocolo: CAD-2026-0042',
975
- action: { label: 'Ver cadastro', icon: 'pi pi-arrow-right', onClick: () => abrirCadastro() },
976
- },
977
- })
978
- }
979
- </script>
980
-
981
- <template>
982
- <TopToast :base-z-index="30000" />
983
- <TopButton label="Salvar" @click="salvar" />
984
- </template>
985
- ```
986
-
987
- | Prop | Tipo | Padrão | Finalidade |
988
- |---|---|---|---|
989
- | `baseZIndex` | `number` | `30000` | Camada base das notificações. |
990
-
991
- Além das opções usuais de `ToastMessageOptions` do PrimeVue (`severity`,
992
- `summary`, `detail`, `life`, `closable` etc.), `data` aceita `TopToastData`:
993
-
994
- | Campo | Tipo | Efeito |
995
- |---|---|---|
996
- | `data.footer` | `string \| number` | Texto discreto abaixo da mensagem. |
997
- | `data.action.label` | `string` | Rótulo da ação. |
998
- | `data.action.icon` | `string` opcional | Classe de ícone PrimeIcons. |
999
- | `data.action.onClick` | `() => void` opcional | Função chamada ao clicar na ação. |
1000
-
1001
- | Slot | Parâmetros recebidos | Uso |
1002
- |---|---|---|
1003
- | `action` | `{ action, message, run }` | Substitui o botão; execute `run()` para chamar `action.onClick`. |
1004
- | `footer` | `{ message, footer }` | Substitui o rodapé. |
1005
-
1006
- ## Tipos e exports públicos
1007
-
1008
- O pacote raiz exporta todos os componentes, `TopSolutionsPreset`, `colors` e
1009
- os tipos abaixo. Use `import type` para não acrescentar código ao bundle.
1010
-
1011
- ```ts
1012
- import {
1013
- colors,
1014
- TopSolutionsPreset,
1015
- type TopButtonSeverity,
1016
- type TopDatePickerSelectionMode,
1017
- type TopDatePickerValue,
1018
- type TopFileUploadError,
1019
- type TopFileUploadValue,
1020
- type TopInputNumberValue,
1021
- type TopInputNumberMode,
1022
- type TopInputNumberButtonLayout,
1023
- type TopInputNumberCurrencyInputMode,
1024
- type TopNavItem,
1025
- type TopNavSection,
1026
- type TopTabItem,
1027
- type TopToastData,
1028
- } from '@topjoao/top-design-system'
1029
- ```
1030
-
1031
- `TopNavItem` descreve um nó (`id`, `label`, `to?`, `icon?`, `disabled?`,
1032
- `children?`, `data?`); `TopNavSection` é o mesmo contrato com `children`
1033
- obrigatório. `TopNavAction`, `TopNavUser`, `TopNavClient` e
1034
- `TopNavUserMenuItem` correspondem às props de mesmo nome. A aparência da barra
1035
- é definida por `TopNavBarAppearance` e seus subtipos exportados:
1036
- `TopNavBarColors`, `TopNavBarSurfaces`, `TopNavBarBorders`, `TopNavBarShape` e
1037
- `TopNavBarFocus`. `TopNavBarSpacing` tipa as propriedades opcionais
1038
- `headerPadding` e `breadcrumbPadding` da prop `spacing`.
1039
-
1040
- `TopInputNumberValue`, `TopInputNumberMode`, `TopInputNumberButtonLayout` e
1041
- `TopInputNumberCurrencyInputMode`
1042
- tipam, respectivamente, o valor, o modo de formatação, o layout dos botões e o
1043
- modo de entrada monetária do campo numérico. `colors` expõe as escalas
1044
- imutáveis `primary`, `secondary`, `success`, `warn` e
1045
- `danger`, cada uma com tons de `50` a `950`.
1046
-
1047
- ## Desenvolvimento da biblioteca
994
+ O componente emite somente `update:modelValue`. Atributos adicionais, incluindo
995
+ as opções de passthrough do PrimeVue, são repassados ao componente `Tabs`.
996
+
997
+ ## TopToast
998
+
999
+ `TopToast` personaliza o renderizador do serviço `Toast` do PrimeVue. Registre
1000
+ `ToastService` uma vez, renderize um único `TopToast` perto da raiz e dispare
1001
+ mensagens com `useToast`. Ele não recebe uma lista de mensagens por prop.
1002
+
1003
+ ```ts
1004
+ // main.ts
1005
+ import PrimeVue from 'primevue/config'
1006
+ import ToastService from 'primevue/toastservice'
1007
+ import { createApp } from 'vue'
1008
+ import App from './App.vue'
1009
+
1010
+ createApp(App).use(PrimeVue).use(ToastService).mount('#app')
1011
+ ```
1012
+
1013
+ ```vue
1014
+ <script setup lang="ts">
1015
+ import { useToast } from 'primevue/usetoast'
1016
+ import { TopButton, TopToast } from '@topjoao/top-design-system'
1017
+
1018
+ const toast = useToast()
1019
+ const abrirCadastro = () => { /* navegue para o cadastro */ }
1020
+
1021
+ function salvar() {
1022
+ toast.add({
1023
+ severity: 'success', summary: 'Cadastro concluído', detail: 'As alterações foram salvas.', life: 5000,
1024
+ data: {
1025
+ footer: 'Protocolo: CAD-2026-0042',
1026
+ action: { label: 'Ver cadastro', icon: 'pi pi-arrow-right', onClick: () => abrirCadastro() },
1027
+ },
1028
+ })
1029
+ }
1030
+ </script>
1031
+
1032
+ <template>
1033
+ <TopToast :base-z-index="30000" />
1034
+ <TopButton label="Salvar" @click="salvar" />
1035
+ </template>
1036
+ ```
1037
+
1038
+ | Prop | Tipo | Padrão | Finalidade |
1039
+ |---|---|---|---|
1040
+ | `baseZIndex` | `number` | `30000` | Camada base das notificações. |
1041
+
1042
+ Além das opções usuais de `ToastMessageOptions` do PrimeVue (`severity`,
1043
+ `summary`, `detail`, `life`, `closable` etc.), `data` aceita `TopToastData`:
1044
+
1045
+ | Campo | Tipo | Efeito |
1046
+ |---|---|---|
1047
+ | `data.footer` | `string \| number` | Texto discreto abaixo da mensagem. |
1048
+ | `data.action.label` | `string` | Rótulo da ação. |
1049
+ | `data.action.icon` | `string` opcional | Classe de ícone PrimeIcons. |
1050
+ | `data.action.onClick` | `() => void` opcional | Função chamada ao clicar na ação. |
1051
+
1052
+ | Slot | Parâmetros recebidos | Uso |
1053
+ |---|---|---|
1054
+ | `action` | `{ action, message, run }` | Substitui o botão; execute `run()` para chamar `action.onClick`. |
1055
+ | `footer` | `{ message, footer }` | Substitui o rodapé. |
1056
+
1057
+ ## Tipos e exports públicos
1058
+
1059
+ O pacote raiz exporta todos os componentes, `TopSolutionsPreset`, `colors` e
1060
+ os tipos abaixo. Use `import type` para não acrescentar código ao bundle.
1061
+
1062
+ ```ts
1063
+ import {
1064
+ colors,
1065
+ TopSolutionsPreset,
1066
+ type TopButtonSeverity,
1067
+ type TopDatePickerSelectionMode,
1068
+ type TopDatePickerValue,
1069
+ type TopFileUploadError,
1070
+ type TopFileUploadValue,
1071
+ type TopInputNumberValue,
1072
+ type TopInputNumberMode,
1073
+ type TopInputNumberButtonLayout,
1074
+ type TopInputNumberCurrencyInputMode,
1075
+ type TopNavItem,
1076
+ type TopNavSection,
1077
+ type TopTabItem,
1078
+ type TopToastData,
1079
+ } from '@topjoao/top-design-system'
1080
+ ```
1081
+
1082
+ `TopNavItem` descreve um nó (`id`, `label`, `to?`, `icon?`, `disabled?`,
1083
+ `children?`, `data?`); `TopNavSection` é o mesmo contrato com `children`
1084
+ obrigatório. `TopNavAction`, `TopNavUser`, `TopNavClient` e
1085
+ `TopNavUserMenuItem` correspondem às props de mesmo nome. A aparência da barra
1086
+ é definida por `TopNavBarAppearance` e seus subtipos exportados:
1087
+ `TopNavBarColors`, `TopNavBarSurfaces`, `TopNavBarBorders`, `TopNavBarShape` e
1088
+ `TopNavBarFocus`. `TopNavBarSpacing` tipa as propriedades opcionais
1089
+ `headerPadding` e `breadcrumbPadding` da prop `spacing`.
1090
+
1091
+ `TopInputNumberValue`, `TopInputNumberMode`, `TopInputNumberButtonLayout` e
1092
+ `TopInputNumberCurrencyInputMode`
1093
+ tipam, respectivamente, o valor, o modo de formatação, o layout dos botões e o
1094
+ modo de entrada monetária do campo numérico. `colors` expõe as escalas
1095
+ imutáveis `primary`, `secondary`, `success`, `warn` e
1096
+ `danger`, cada uma com tons de `50` a `950`.
1097
+
1098
+ ## Desenvolvimento da biblioteca
1048
1099
 
1049
1100
  ```bash
1050
1101
  npm install
@@ -1070,7 +1121,7 @@ npm run storybook
1070
1121
  ```
1071
1122
 
1072
1123
  Abra `http://localhost:6006` para acessar as histórias de `TopButton`,
1073
- `TopConfirmDialog`, `TopDatePicker`, `TopInputText`, `TopInputNumber`, `TopSelect` e `TopTabs`. Use o botão de
1124
+ `TopConfirmDialog`, `TopDatePicker`, `TopInputText`, `TopTextArea`, `TopInputNumber`, `TopSelect` e `TopTabs`. Use o botão de
1074
1125
  contraste na barra superior para alternar o preview entre tema claro e escuro.
1075
1126
  Para gerar a versão estática da documentação, execute:
1076
1127
 
@@ -1084,14 +1135,14 @@ Para gerar um pacote local instalável:
1084
1135
  npm pack
1085
1136
  ```
1086
1137
 
1087
- Para publicar uma nova versão estável, primeiro incremente a versão seguindo o
1088
- versionamento semântico; versões já publicadas no npm não podem ser
1089
- sobrescritas. Use `patch`, `minor` ou `major` conforme o impacto da mudança.
1090
-
1091
- ```bash
1092
- npm version patch --no-git-tag-version
1093
- npm publish --access public --tag latest
1094
- ```
1095
-
1096
- A tag `latest` é a padrão do npm. Assim, consumidores instalam a versão estável
1097
- simplesmente com `npm install @topjoao/top-design-system`.
1138
+ Para publicar uma nova versão estável, primeiro incremente a versão seguindo o
1139
+ versionamento semântico; versões já publicadas no npm não podem ser
1140
+ sobrescritas. Use `patch`, `minor` ou `major` conforme o impacto da mudança.
1141
+
1142
+ ```bash
1143
+ npm version patch --no-git-tag-version
1144
+ npm publish --access public --tag latest
1145
+ ```
1146
+
1147
+ A tag `latest` é a padrão do npm. Assim, consumidores instalam a versão estável
1148
+ simplesmente com `npm install @topjoao/top-design-system`.