@topjoao/top-design-system 0.1.0-beta.18 → 0.1.0-beta.19

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
@@ -106,240 +106,18 @@ import App from './App.vue'
106
106
  createApp(App).use(TopSolutionsDesignSystem).mount('#app')
107
107
  ```
108
108
 
109
- Após o registro, os componentes podem ser utilizados sem importação manual. A
110
- entrada `/plugin` também fornece as declarações globais usadas pela IDE.
111
-
112
- ## TopNavBar
113
-
114
- Barra de navegação responsiva inspirada no AppSidebar do TopLicita. O
115
- componente fornece apenas layout e interação: a aplicação consumidora continua
116
- responsável por rotas, permissões, sessão, cliente/órgão, busca remota,
117
- favoritos, Aia, suporte e integrações. Nenhuma dessas ações é executada pela
118
- biblioteca; todas são comunicadas por eventos.
119
-
120
- ```vue
121
- <script setup lang="ts">
122
- import { ref } from 'vue'
123
- import {
124
- TopNavBar,
125
- type TopNavAction,
126
- type TopNavItem,
127
- type TopNavSection,
128
- } from '@topjoao/top-design-system'
129
-
130
- const clienteAtual = ref('prefeitura-a')
131
- const favorito = ref(false)
132
-
133
- const secoes: TopNavSection[] = [
134
- {
135
- id: 'planejamento',
136
- label: 'Planejamento',
137
- icon: 'pi pi-book',
138
- children: [
139
- {
140
- id: 'programacao',
141
- label: 'Programação',
142
- children: [
143
- { id: 'calendario', label: 'Calendário', to: '/programacao/calendario' },
144
- ],
145
- },
146
- ],
147
- },
148
- ]
149
-
150
- function navegar(item: TopNavItem) {
151
- if (item.to) router.push(item.to)
152
- }
153
-
154
- function executarIntegracao(action: TopNavAction) {
155
- // Abra a integração identificada por action.id.
156
- }
157
- </script>
158
-
159
- <template>
160
- <TopNavBar
161
- :sections="secoes"
162
- active-item-id="calendario"
163
- searchable
164
- show-aia
165
- show-support
166
- show-favorite-toggle
167
- :favorite-active="favorito"
168
- :actions="[
169
- { id: 'integracoes', label: 'Integrações', icon: 'pi pi-th-large' },
170
- ]"
171
- :user="{ name: 'João Silva', subtitle: 'Administrador', initials: 'JS' }"
172
- :user-menu-items="[
173
- { id: 'perfil', label: 'Meu perfil', icon: 'pi pi-user' },
174
- { id: 'sair', label: 'Sair', icon: 'pi pi-sign-out' },
175
- ]"
176
- @navigate="navegar"
177
- @search="consultarMenusPermitidos"
178
- @toggle-aia="alternarAia"
179
- @open-support="abrirCentralSuporte"
180
- @toggle-favorite="favorito = !favorito"
181
- @action="executarIntegracao"
182
- @user-action="executarAcaoDaSessao"
183
- >
184
- <template #brand="{ compact }">
185
- <img src="/logo.svg" alt="Minha organização">
186
- <span v-if="!compact">Sistema de Contratações</span>
187
- </template>
188
-
189
- <template #context="{ compact }">
190
- <select v-model="clienteAtual" aria-label="Cliente atual">
191
- <option value="prefeitura-a">Prefeitura A</option>
192
- <option value="prefeitura-b">Prefeitura B</option>
193
- </select>
194
- <span v-if="!compact">Poder Executivo</span>
195
- </template>
196
- </TopNavBar>
197
- </template>
198
- ```
199
-
200
- ### Menu e breadcrumbs
201
-
202
- `sections` aceita uma árvore de profundidade arbitrária. Cada nó usa
203
- `TopNavItem` (`id`, `label`, `to?`, `icon?`, `disabled?`, `children?`, `data?`).
204
- Seções sem filhos são removidas e um `children: []` nunca cria um painel vazio.
205
- No desktop, a primeira coluna do painel mestre–detalhe tem `16rem`; os itens de
206
- cada nível são repartidos em colunas de `18rem`, no máximo dez por coluna.
207
- Subníveis aparecem sempre à direita do nível de origem.
208
-
209
- Breadcrumbs estão habilitados por padrão e começam por `Início / Navegação`.
210
- Há duas formas de fornecer a trilha:
211
-
212
- - informe `breadcrumbs` com itens `TopNavBreadcrumb`; `sectionId` liga o item a
213
- uma seção e `menuId` liga a qualquer nó com filhos;
214
- - omita `breadcrumbs` e informe `activeItemId`; a trilha é derivada da árvore.
215
-
216
- Por exemplo, `calendario` dentro de `Programação` em `Planejamento` gera
217
- `Início / Navegação / Planejamento / Programação / Calendário`. A rota ativa
218
- não recebe fundo permanente nos menus desktop; somente hover e o ramo que está
219
- sendo explorado recebem destaque.
220
-
221
- ### Props
222
-
223
- | Prop | Tipo / padrão | Finalidade |
224
- |---|---|---|
225
- | `sections` | `TopNavSection[]` / `[]` | Árvore de navegação já filtrada pela aplicação. |
226
- | `breadcrumbs` | `TopNavBreadcrumb[]` / `[]` | Trilha explícita; vazia permite derivação por `activeItemId`. |
227
- | `homeItem` | `TopNavItem` / `Início` | Item inicial emitido ao clicar em Início. |
228
- | `navigationLabel` | `string` / `Navegação` | Rótulo do menu mestre. |
229
- | `activeItemId` | `string` | Nó atual, usado no breadcrumb e no Drawer. |
230
- | `searchable` | `boolean` / `false` | Habilita busca desktop e busca própria do Drawer. |
231
- | `searchValue` | `string` | Valor opcionalmente controlado com `v-model:search-value`. |
232
- | `searchResults` | `TopNavItem[]` | Resultados controlados; sem a prop, a árvore é filtrada localmente. |
233
- | `searchPlaceholder` | `string` | Placeholder das duas buscas. |
234
- | `showAia`, `showSupport` | `boolean` / `false` | Exibem as ações opcionais. |
235
- | `aiaActive` | `boolean` / `false` | Estado visual do botão Aia. |
236
- | `aiaLabel`, `supportLabel` | `string` | Textos acessíveis e rótulos do Drawer. |
237
- | `actions` | `TopNavAction[]` / `[]` | Ações genéricas, como integrações, emitidas por `action`. |
238
- | `user` | `TopNavUser` | Dados exclusivamente visuais do usuário. |
239
- | `userMenuItems` | `TopNavUserMenuItem[]` | Opções emitidas por `user-action`; suporta separadores. |
240
- | `favoriteItems` | `TopNavItem[]` / `[]` | Favoritos fornecidos pelo pai para dropdown e Drawer. |
241
- | `showFavoriteToggle` | `boolean` / `false` | Exibe a estrela da página atual. |
242
- | `favoriteActive` | `boolean` / `false` | Estado visual da estrela atual. |
243
- | `mobileOpen` | `boolean` | Controle opcional com `v-model:mobile-open`. |
244
- | `appearance` | `TopNavBarAppearance` | Tokens visuais locais descritos abaixo. |
245
-
246
- ### Eventos
247
-
248
- | Evento | Payload | Quando ocorre |
249
- |---|---|---|
250
- | `navigate` | `TopNavItem` | Início, menu, resultado ou favorito é selecionado. |
251
- | `search` | `string` | A consulta muda no desktop ou no Drawer. |
252
- | `update:searchValue` | `string` | Atualização de `v-model:search-value`. |
253
- | `update:mobileOpen` | `boolean` | Atualização de `v-model:mobile-open`. |
254
- | `toggle-aia` | — | A ação Aia é acionada. |
255
- | `open-support` | — | A ação de suporte é acionada. |
256
- | `toggle-favorite` | — | A estrela da página atual é acionada. |
257
- | `action` | `TopNavAction` | Uma ação genérica/integração é acionada. |
258
- | `user-action` | `TopNavUserMenuItem` | Uma opção de usuário é selecionada. |
259
- | `user-click` | `TopNavUser \| undefined` | A área de usuário sem menu é acionada. |
260
-
261
- `Ctrl+K` e `Cmd+K` abrem/focam a busca. Em telas menores que `1024px`, o
262
- atalho abre primeiro o Drawer e foca a busca móvel. `Escape` fecha os painéis.
263
-
264
- ### Slots
265
-
266
- | Slot | Uso |
267
- |---|---|
268
- | `brand` | Marca; recebe `{ compact }`. |
269
- | `context`, `scope` ou `client` | Contexto operacional; aliases com prioridade nessa ordem e `{ compact }`. |
270
- | `context-compact` | Variante explícita usada no último estágio de overflow. |
271
- | `actions` | Conteúdo adicional do cabeçalho; recebe `{ compact, close }`. |
272
- | `aia-icon`, `support-icon` | Ícones customizados das ações quadradas. |
273
- | `user` | Conteúdo do gatilho de usuário; recebe `{ user, compact }`. |
274
- | `user-menu` | Painel de usuário; recebe `{ items, select }`. |
275
- | `search-results` | Resultados customizados; recebe `{ items, select }`. |
276
- | `breadcrumb-actions` | Ações adicionais no fim da segunda faixa. |
277
- | `drawer-header` | Cabeçalho inteiro; recebe `{ close }`. |
278
- | `drawer-brand` | Marca do Drawer; por padrão reutiliza `brand`. |
279
- | `drawer-search` | Busca inteira; recebe `{ query, update, clear }`. |
280
- | `drawer-actions` | Ações; recebe `{ actions, select, close }`. |
281
- | `drawer-before-menu`, `drawer-after-menu` | Conteúdo antes/depois do trilho rolável. |
282
- | `drawer-menu` | Substitui a árvore; recebe `{ sections, select, close }`. |
283
- | `drawer-user` | Rodapé de usuário; recebe `{ user, open, toggle }`. |
284
- | `drawer-footer` | Conteúdo final adicional; recebe `{ close }`. |
285
-
286
- ### Aparência e responsividade
287
-
288
- `appearance` aceita `headerBackground`, `breadcrumbBackground`,
289
- `drawerBackground`, `drawerFooterBackground`, `textColor`, `mutedTextColor`,
290
- `accentColor`, `menuBackground`, `menuTextColor`, `menuHoverBackground`,
291
- `menuExploredBackground`, `borderColor`, `menuBorderColor` (a borda externa de
292
- 6px), `menuOutlineColor`, `radius`, `drawerRadius`, `headerHeight` (`height` é
293
- mantido como alias), `drawerWidth`, `shadow`, `fontFamily`, `fontSize`,
294
- `secondaryFontSize`, `captionFontSize`, `lineHeight`, `fontWeight`,
295
- `strongFontWeight`, `actionSize`, `headerPadding`, `mobileHeaderPadding`,
296
- `breadcrumbPadding`, `mobileBreadcrumbPadding`, `menuItemPadding`,
297
- `itemLineHeight`, `sectionWidth`, `columnWidth` e `contextCompactWidth`.
298
-
299
- A biblioteca não fixa tipografia inline. Por padrão, família, tamanho, peso e
300
- altura de linha são herdados da aplicação consumidora. Além disso, `appearance`
301
- só cria variáveis inline para propriedades que foram realmente informadas; os
302
- valores fiéis ao AppSidebar existem apenas como *fallbacks* no CSS. Assim, um
303
- tema global pode controlar o componente sem precisar usar `!important`:
304
-
305
- ```css
306
- :root {
307
- --top-nav-font-family: var(--app-font-family);
308
- --top-nav-font-size: var(--app-font-size);
309
- --top-nav-strong-font-weight: 600;
310
- --top-nav-action-size: 2.5rem;
311
- --top-nav-header-padding: 0.625rem 1.5rem;
312
- --top-nav-menu-item-padding: 0.5rem 0.75rem;
313
- --top-nav-section-width: 16rem;
314
- --top-nav-column-width: 18rem;
315
- }
316
- ```
317
-
318
- As variáveis globais também alcançam o Drawer teleportado. Um valor passado por
319
- `appearance` tem precedência local e não altera os demais tokens do tema.
320
-
321
- O breakpoint móvel é `1024px`. No desktop, um `ResizeObserver` reaplica a mesma
322
- sequência progressiva do AppSidebar: ações colapsam abaixo de `1440px`, busca
323
- vira ícone abaixo de `1320px`, nome do usuário some abaixo de `1180px` e, se o
324
- conteúdo ainda transbordar, o contexto recebe `compact: true`. O último estágio
325
- também limita o contêiner do contexto a `3.25rem`; use `context-compact` quando
326
- quiser controlar exatamente o que permanece visível.
327
-
328
- Abaixo de `1024px`, a navegação desktop desaparece e o Drawer do PrimeVue assume.
329
- Ele mantém cabeçalho, busca, ações, trilho translúcido rolável, árvore recursiva,
330
- favoritos e usuário. A transição `menu-expand` existe somente dentro do Drawer;
331
- os dropdowns desktop abrem sem animação e suas áreas de hover incluem o espaço
332
- entre gatilho e painel.
333
-
334
- ## TopButton
109
+ Após o registro, os componentes podem ser utilizados sem importação manual. A
110
+ entrada `/plugin` também fornece as declarações globais usadas pela IDE.
111
+
112
+ ## TopButton
335
113
 
336
114
  Exemplo
337
115
 
338
116
  ```vue
339
117
  <template>
340
- <TopButton label="Salvar" icon="pi pi-save" @click="salvar" />
341
- <TopButton label="Cancelar" secondary />
342
- <TopButton label="Excluir" severity="danger" />
118
+ <TopButton label="Salvar" icon="pi pi-save" @click="salvar" />
119
+ <TopButton label="Cancelar" secondary />
120
+ <TopButton label="Excluir" severity="danger" />
343
121
 
344
122
  <TopButton label="Consultar" outlined>
345
123
  <template #icon>
@@ -357,15 +135,15 @@ Exemplo
357
135
  | `icon` | `string` | `''` |
358
136
  | `loading` | `boolean` | `false` |
359
137
  | `class` | `string` | `''` |
360
- | `outlined` | `boolean` | `false` |
361
- | `severity` | `'primary' \| 'secondary' \| 'success' \| 'warn' \| 'danger'` | `'primary'` |
362
- | `secondary` | `boolean` | `false` |
138
+ | `outlined` | `boolean` | `false` |
139
+ | `severity` | `'primary' \| 'secondary' \| 'success' \| 'warn' \| 'danger'` | `'primary'` |
140
+ | `secondary` | `boolean` | `false` |
363
141
  | `disabled` | `boolean` | `false` |
364
142
  | `unstyled` | `boolean` | `false` |
365
143
  | `type` | `'button' \| 'submit' \| 'reset'` | `'button'` |
366
144
 
367
- O componente emite `click` sem payload e oferece o slot nomeado `icon`.
368
- `secondary` permanece como atalho compatível para `severity="secondary"`.
145
+ O componente emite `click` sem payload e oferece o slot nomeado `icon`.
146
+ `secondary` permanece como atalho compatível para `severity="secondary"`.
369
147
 
370
148
  ## TopConfirmDialog
371
149
 
@@ -414,76 +192,76 @@ não fecha automaticamente o diálogo, permitindo que a aplicação aguarde uma
414
192
  operação assíncrona. Os slots `message` e default permitem substituir a mensagem
415
193
  textual.
416
194
 
417
- ## TopDatePicker
418
-
419
- Seletor de datas baseado no `DatePicker` do PrimeVue. O valor permanece como
420
- `Date` (ou arrays de `Date` nos modos `multiple` e `range`); `dateFormat` altera
421
- somente a apresentação no campo e não converte o `v-model` para texto.
422
- No modo padrão (`single` com `dd/mm/yy`), a digitação recebe automaticamente a
423
- máscara brasileira `dd/mm/aaaa`.
424
-
425
- ```vue
426
- <script setup lang="ts">
427
- import { ref } from 'vue'
428
- import { TopDatePicker } from '@topjoao/top-design-system'
429
-
430
- const dataNascimento = ref<Date | null>(null)
431
- </script>
432
-
433
- <template>
434
- <TopDatePicker
435
- v-model="dataNascimento"
436
- label="Data de nascimento"
437
- placeholder="Selecione a data"
438
- :max-date="new Date()"
439
- required
440
- error="Informe uma data válida."
441
- @date-select="validarData"
442
- />
443
- </template>
444
- ```
445
-
446
- | Prop | Tipo | Padrão |
447
- |---|---|---|
448
- | `modelValue` | `Date \| Date[] \| (Date \| null)[] \| null` | `null` |
449
- | `label` | `string` | `''` |
450
- | `placeholder` | `string` | `'dd/mm/aaaa'` |
451
- | `required` | `boolean` | `false` |
452
- | `error` | `string` | `''` |
453
- | `invalid` | `boolean` | `false` |
454
- | `disabled` | `boolean` | `false` |
455
- | `readonly` | `boolean` | `false` |
456
- | `selectionMode` | `'single' \| 'multiple' \| 'range'` | `'single'` |
457
- | `dateFormat` | `string` | `'dd/mm/yy'` |
458
- | `minDate` / `maxDate` | `Date` | `undefined` |
459
- | `showIcon` | `boolean` | `true` |
460
- | `iconDisplay` | `'button' \| 'input'` | `'input'` |
461
- | `manualInput` | `boolean` | `true` |
462
- | `showButtonBar` | `boolean` | `false` |
463
- | `appendTo` | `'body' \| 'self' \| HTMLElement` | `'body'` |
464
-
465
- Eventos: `update:modelValue`, `input`, `change`, `date-select`, `show`, `hide`,
466
- `today-click`, `clear-click`, `month-change`, `year-change`, `focus`, `blur` e
467
- `keydown`. Os slots do `DatePicker` do PrimeVue são repassados pelo wrapper,
468
- incluindo `date`, `header`, `footer`, `buttonbar`, `inputicon`, `dropdownicon`,
469
- `previcon` e `nexticon`.
470
-
471
- `required` adiciona o atributo nativo e o asterisco visual; a validação continua
472
- sob responsabilidade da aplicação. `error` ativa o estado inválido, associa a
473
- mensagem ao input com atributos ARIA e a exibe abaixo do campo. `readonly`
474
- impede edição e seleção sem desabilitar o controle, enquanto `disabled` remove a
475
- interação. No modo escuro, o campo usa os tokens públicos `--top-field-*`.
476
-
477
- ## TopFileUpload
478
-
479
- Seletor de arquivos baseado no `FileUpload` do PrimeVue. O componente valida e
480
- apresenta os arquivos, mas não os envia: a aplicação consumidora controla o
481
- upload por `v-model` e pelos eventos.
482
-
483
- ```vue
484
- <script setup lang="ts">
485
- import { ref } from 'vue'
486
- import { TopFileUpload } from '@topjoao/top-design-system'
195
+ ## TopDatePicker
196
+
197
+ Seletor de datas baseado no `DatePicker` do PrimeVue. O valor permanece como
198
+ `Date` (ou arrays de `Date` nos modos `multiple` e `range`); `dateFormat` altera
199
+ somente a apresentação no campo e não converte o `v-model` para texto.
200
+ No modo padrão (`single` com `dd/mm/yy`), a digitação recebe automaticamente a
201
+ máscara brasileira `dd/mm/aaaa`.
202
+
203
+ ```vue
204
+ <script setup lang="ts">
205
+ import { ref } from 'vue'
206
+ import { TopDatePicker } from '@topjoao/top-design-system'
207
+
208
+ const dataNascimento = ref<Date | null>(null)
209
+ </script>
210
+
211
+ <template>
212
+ <TopDatePicker
213
+ v-model="dataNascimento"
214
+ label="Data de nascimento"
215
+ placeholder="Selecione a data"
216
+ :max-date="new Date()"
217
+ required
218
+ error="Informe uma data válida."
219
+ @date-select="validarData"
220
+ />
221
+ </template>
222
+ ```
223
+
224
+ | Prop | Tipo | Padrão |
225
+ |---|---|---|
226
+ | `modelValue` | `Date \| Date[] \| (Date \| null)[] \| null` | `null` |
227
+ | `label` | `string` | `''` |
228
+ | `placeholder` | `string` | `'dd/mm/aaaa'` |
229
+ | `required` | `boolean` | `false` |
230
+ | `error` | `string` | `''` |
231
+ | `invalid` | `boolean` | `false` |
232
+ | `disabled` | `boolean` | `false` |
233
+ | `readonly` | `boolean` | `false` |
234
+ | `selectionMode` | `'single' \| 'multiple' \| 'range'` | `'single'` |
235
+ | `dateFormat` | `string` | `'dd/mm/yy'` |
236
+ | `minDate` / `maxDate` | `Date` | `undefined` |
237
+ | `showIcon` | `boolean` | `true` |
238
+ | `iconDisplay` | `'button' \| 'input'` | `'input'` |
239
+ | `manualInput` | `boolean` | `true` |
240
+ | `showButtonBar` | `boolean` | `false` |
241
+ | `appendTo` | `'body' \| 'self' \| HTMLElement` | `'body'` |
242
+
243
+ Eventos: `update:modelValue`, `input`, `change`, `date-select`, `show`, `hide`,
244
+ `today-click`, `clear-click`, `month-change`, `year-change`, `focus`, `blur` e
245
+ `keydown`. Os slots do `DatePicker` do PrimeVue são repassados pelo wrapper,
246
+ incluindo `date`, `header`, `footer`, `buttonbar`, `inputicon`, `dropdownicon`,
247
+ `previcon` e `nexticon`.
248
+
249
+ `required` adiciona o atributo nativo e o asterisco visual; a validação continua
250
+ sob responsabilidade da aplicação. `error` ativa o estado inválido, associa a
251
+ mensagem ao input com atributos ARIA e a exibe abaixo do campo. `readonly`
252
+ impede edição e seleção sem desabilitar o controle, enquanto `disabled` remove a
253
+ interação. No modo escuro, o campo usa os tokens públicos `--top-field-*`.
254
+
255
+ ## TopFileUpload
256
+
257
+ Seletor de arquivos baseado no `FileUpload` do PrimeVue. O componente valida e
258
+ apresenta os arquivos, mas não os envia: a aplicação consumidora controla o
259
+ upload por `v-model` e pelos eventos.
260
+
261
+ ```vue
262
+ <script setup lang="ts">
263
+ import { ref } from 'vue'
264
+ import { TopFileUpload } from '@topjoao/top-design-system'
487
265
 
488
266
  const anexos = ref<File[]>([])
489
267
 
@@ -500,15 +278,15 @@ function enviarArquivos(files: File[]) {
500
278
  multiple
501
279
  :max-file-size="5 * 1024 * 1024"
502
280
  :max-files="5"
503
- required
504
- @select="enviarArquivos"
505
- />
281
+ required
282
+ @select="enviarArquivos"
283
+ />
506
284
  </template>
507
285
  ```
508
286
 
509
287
  | Prop | Tipo | Padrão |
510
288
  |---|---|---|
511
- | `modelValue` | `File \| File[] \| null` | `null` |
289
+ | `modelValue` | `File \| File[] \| null` | `null` |
512
290
  | `label` | `string` | `''` |
513
291
  | `placeholder` | `string` | `'Arraste e solte o arquivo aqui'` |
514
292
  | `required` | `boolean` | `false` |
@@ -525,8 +303,8 @@ function enviarArquivos(files: File[]) {
525
303
  Eventos: `update:modelValue`, `select`, `change`, `remove`, `clear` e `error`.
526
304
  Erros de tipo, tamanho e quantidade possuem `code`, `message` e o `file`
527
305
  relacionado. Os slots `empty` e `preview` permitem customizar a área vazia e a
528
- pré-visualização. Os métodos `choose()` e `clear()` ficam disponíveis pela ref
529
- do componente.
306
+ pré-visualização. Os métodos `choose()` e `clear()` ficam disponíveis pela ref
307
+ do componente.
530
308
 
531
309
  ## TopInputText
532
310
 
@@ -635,6 +413,59 @@ O texto das opções é limitado visualmente pela largura disponível do painel,
635
413
  sem corte por quantidade fixa de caracteres; o tooltip padrão exibe o valor
636
414
  completo quando `showTooltip` está ativo.
637
415
 
416
+ ## TopTabs
417
+
418
+ Navegação em abas baseada em `Tabs`, `TabList`, `Tab`, `TabPanels` e `TabPanel`
419
+ do PrimeVue, com estrutura simplificada e estilos dos temas claro e escuro do
420
+ Design System.
421
+
422
+ ```vue
423
+ <script setup lang="ts">
424
+ import { ref } from 'vue'
425
+ import {
426
+ TopTabs,
427
+ type TopTabItem,
428
+ type TopTabValue,
429
+ } from '@topjoao/top-design-system'
430
+
431
+ const activeTab = ref<TopTabValue>('dados')
432
+ const tabs: TopTabItem[] = [
433
+ { value: 'dados', label: 'Dados' },
434
+ { value: 'documentos', label: 'Documentos' },
435
+ { value: 'auditoria', label: 'Auditoria', disabled: true },
436
+ ]
437
+ </script>
438
+
439
+ <template>
440
+ <TopTabs v-model="activeTab" :tabs="tabs">
441
+ <template #dados>
442
+ Dados gerais do processo
443
+ </template>
444
+
445
+ <template #documentos>
446
+ Documentos anexados
447
+ </template>
448
+
449
+ <template #auditoria>
450
+ Histórico de auditoria
451
+ </template>
452
+ </TopTabs>
453
+ </template>
454
+ ```
455
+
456
+ | Prop | Tipo | Padrão |
457
+ |---|---|---|
458
+ | `modelValue` | `string \| number` | obrigatório |
459
+ | `tabs` | `TopTabItem[]` | obrigatório |
460
+ | `lazy` | `boolean` | `false` |
461
+ | `scrollable` | `boolean` | `true` |
462
+
463
+ Cada `TopTabItem` possui `value`, `label` e `disabled?`. O `value` deve ser
464
+ único e identifica tanto a seleção quanto o slot do painel; por exemplo,
465
+ `value: 'documentos'` utiliza `#documentos`. Cada slot recebe `tab` e `active`.
466
+ O componente emite somente `update:modelValue`. Atributos adicionais, incluindo
467
+ as opções de passthrough do PrimeVue, são repassados ao componente `Tabs`.
468
+
638
469
  ## Desenvolvimento da biblioteca
639
470
 
640
471
  ```bash
@@ -661,7 +492,7 @@ npm run storybook
661
492
  ```
662
493
 
663
494
  Abra `http://localhost:6006` para acessar as histórias de `TopButton`,
664
- `TopConfirmDialog`, `TopDatePicker`, `TopInputText` e `TopSelect`. Use o botão de
495
+ `TopConfirmDialog`, `TopDatePicker`, `TopInputText`, `TopSelect` e `TopTabs`. Use o botão de
665
496
  contraste na barra superior para alternar o preview entre tema claro e escuro.
666
497
  Para gerar a versão estática da documentação, execute:
667
498