@topjoao/top-design-system 0.1.0-beta.17 → 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,112 +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 corporativa com breadcrumbs, menu hierárquico, busca e
115
- ações opcionais. A aplicação consumidora fornece os dados do menu, define a
116
- página ativa e decide o que acontece em cada evento.
117
-
118
- ```vue
119
- <script setup lang="ts">
120
- import { ref } from 'vue'
121
- import { TopNavBar, type TopNavItem } from '@topjoao/top-design-system'
122
-
123
- const clienteAtual = ref('prefeitura-a')
124
-
125
- const secoes = [
126
- {
127
- id: 'planejamento',
128
- label: 'Planejamento',
129
- icon: 'pi pi-book',
130
- children: [
131
- {
132
- id: 'programacao',
133
- label: 'Programação',
134
- children: [
135
- { id: 'calendario', label: 'Calendário', to: '/programacao/calendario' },
136
- ],
137
- },
138
- ],
139
- },
140
- ]
141
-
142
- function navegar(item: TopNavItem) {
143
- // Ex.: router.push(item.to)
144
- }
145
-
146
- function buscarNoMenu(query: string) {
147
- // Filtre ou consulte os itens permitidos para este usuário.
148
- }
149
-
150
- function alternarAssistente() {}
151
- function abrirSuporte() {}
152
- </script>
153
-
154
- <template>
155
- <TopNavBar
156
- :sections="secoes"
157
- active-item-id="calendario"
158
- searchable
159
- show-aia
160
- show-support
161
- @navigate="navegar"
162
- @search="buscarNoMenu"
163
- @toggle-aia="alternarAssistente"
164
- @open-support="abrirSuporte"
165
- >
166
- <template #brand>
167
- <img src="/logo.svg" alt="Minha organização">
168
- </template>
169
-
170
- <template #context>
171
- <select v-model="clienteAtual" aria-label="Cliente atual">
172
- <option value="prefeitura-a">Prefeitura A</option>
173
- <option value="prefeitura-b">Prefeitura B</option>
174
- </select>
175
- </template>
176
- </TopNavBar>
177
- </template>
178
- ```
179
-
180
- `activeItemId` gera automaticamente o breadcrumb da página ativa, incluindo os
181
- ancestrais e dropdowns de cada nível. Por exemplo, um item `calendario` dentro
182
- de `Programação` em `Planejamento` resulta em `Início / Navegação /
183
- Planejamento / Programação / Calendário`.
184
-
185
- Para personalizar a aparência, use nomes orientados ao que é exibido: `textColor`
186
- para textos e ícones principais, `mutedTextColor` para detalhes secundários,
187
- `menuTextColor` para o conteúdo dos dropdowns, além de `headerBackground`,
188
- `breadcrumbBackground`, `menuBackground`, `accentColor`, `borderColor`, `radius`
189
- e `height`.
190
-
191
- | Slot | Uso |
192
- |---|---|
193
- | `brand` | Marca, logo ou nome do sistema. |
194
- | `context` | Contexto de operação: cliente, órgão, ambiente, exercício ou escopo. |
195
- | `actions` | Ações adicionais à direita da barra. |
196
- | `user-menu` | Conteúdo adicional ou substituto para a área de usuário. |
197
- | `search-results` | Apresentação personalizada dos resultados da busca. |
198
- | `breadcrumb-actions` | Ações junto à página atual, como favoritos. |
199
- | `mobile-footer` | Conteúdo adicional no menu mobile. |
200
-
201
- Eventos: `navigate`, `search`, `toggle-aia`, `open-support`,
202
- `toggle-favorite` e `user-action`. A barra não navega, persiste estado ou chama
203
- serviços por conta própria. Quando `searchable` está ativo, `Ctrl+K` (ou `⌘K`
204
- no macOS) move o foco para a pesquisa; `Escape` fecha o painel de busca.
205
-
206
- ## 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
207
113
 
208
114
  Exemplo
209
115
 
210
116
  ```vue
211
117
  <template>
212
- <TopButton label="Salvar" icon="pi pi-save" @click="salvar" />
213
- <TopButton label="Cancelar" secondary />
214
- <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" />
215
121
 
216
122
  <TopButton label="Consultar" outlined>
217
123
  <template #icon>
@@ -229,15 +135,15 @@ Exemplo
229
135
  | `icon` | `string` | `''` |
230
136
  | `loading` | `boolean` | `false` |
231
137
  | `class` | `string` | `''` |
232
- | `outlined` | `boolean` | `false` |
233
- | `severity` | `'primary' \| 'secondary' \| 'success' \| 'warn' \| 'danger'` | `'primary'` |
234
- | `secondary` | `boolean` | `false` |
138
+ | `outlined` | `boolean` | `false` |
139
+ | `severity` | `'primary' \| 'secondary' \| 'success' \| 'warn' \| 'danger'` | `'primary'` |
140
+ | `secondary` | `boolean` | `false` |
235
141
  | `disabled` | `boolean` | `false` |
236
142
  | `unstyled` | `boolean` | `false` |
237
143
  | `type` | `'button' \| 'submit' \| 'reset'` | `'button'` |
238
144
 
239
- O componente emite `click` sem payload e oferece o slot nomeado `icon`.
240
- `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"`.
241
147
 
242
148
  ## TopConfirmDialog
243
149
 
@@ -286,76 +192,76 @@ não fecha automaticamente o diálogo, permitindo que a aplicação aguarde uma
286
192
  operação assíncrona. Os slots `message` e default permitem substituir a mensagem
287
193
  textual.
288
194
 
289
- ## TopDatePicker
290
-
291
- Seletor de datas baseado no `DatePicker` do PrimeVue. O valor permanece como
292
- `Date` (ou arrays de `Date` nos modos `multiple` e `range`); `dateFormat` altera
293
- somente a apresentação no campo e não converte o `v-model` para texto.
294
- No modo padrão (`single` com `dd/mm/yy`), a digitação recebe automaticamente a
295
- máscara brasileira `dd/mm/aaaa`.
296
-
297
- ```vue
298
- <script setup lang="ts">
299
- import { ref } from 'vue'
300
- import { TopDatePicker } from '@topjoao/top-design-system'
301
-
302
- const dataNascimento = ref<Date | null>(null)
303
- </script>
304
-
305
- <template>
306
- <TopDatePicker
307
- v-model="dataNascimento"
308
- label="Data de nascimento"
309
- placeholder="Selecione a data"
310
- :max-date="new Date()"
311
- required
312
- error="Informe uma data válida."
313
- @date-select="validarData"
314
- />
315
- </template>
316
- ```
317
-
318
- | Prop | Tipo | Padrão |
319
- |---|---|---|
320
- | `modelValue` | `Date \| Date[] \| (Date \| null)[] \| null` | `null` |
321
- | `label` | `string` | `''` |
322
- | `placeholder` | `string` | `'dd/mm/aaaa'` |
323
- | `required` | `boolean` | `false` |
324
- | `error` | `string` | `''` |
325
- | `invalid` | `boolean` | `false` |
326
- | `disabled` | `boolean` | `false` |
327
- | `readonly` | `boolean` | `false` |
328
- | `selectionMode` | `'single' \| 'multiple' \| 'range'` | `'single'` |
329
- | `dateFormat` | `string` | `'dd/mm/yy'` |
330
- | `minDate` / `maxDate` | `Date` | `undefined` |
331
- | `showIcon` | `boolean` | `true` |
332
- | `iconDisplay` | `'button' \| 'input'` | `'input'` |
333
- | `manualInput` | `boolean` | `true` |
334
- | `showButtonBar` | `boolean` | `false` |
335
- | `appendTo` | `'body' \| 'self' \| HTMLElement` | `'body'` |
336
-
337
- Eventos: `update:modelValue`, `input`, `change`, `date-select`, `show`, `hide`,
338
- `today-click`, `clear-click`, `month-change`, `year-change`, `focus`, `blur` e
339
- `keydown`. Os slots do `DatePicker` do PrimeVue são repassados pelo wrapper,
340
- incluindo `date`, `header`, `footer`, `buttonbar`, `inputicon`, `dropdownicon`,
341
- `previcon` e `nexticon`.
342
-
343
- `required` adiciona o atributo nativo e o asterisco visual; a validação continua
344
- sob responsabilidade da aplicação. `error` ativa o estado inválido, associa a
345
- mensagem ao input com atributos ARIA e a exibe abaixo do campo. `readonly`
346
- impede edição e seleção sem desabilitar o controle, enquanto `disabled` remove a
347
- interação. No modo escuro, o campo usa os tokens públicos `--top-field-*`.
348
-
349
- ## TopFileUpload
350
-
351
- Seletor de arquivos baseado no `FileUpload` do PrimeVue. O componente valida e
352
- apresenta os arquivos, mas não os envia: a aplicação consumidora controla o
353
- upload por `v-model` e pelos eventos.
354
-
355
- ```vue
356
- <script setup lang="ts">
357
- import { ref } from 'vue'
358
- 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'
359
265
 
360
266
  const anexos = ref<File[]>([])
361
267
 
@@ -372,15 +278,15 @@ function enviarArquivos(files: File[]) {
372
278
  multiple
373
279
  :max-file-size="5 * 1024 * 1024"
374
280
  :max-files="5"
375
- required
376
- @select="enviarArquivos"
377
- />
281
+ required
282
+ @select="enviarArquivos"
283
+ />
378
284
  </template>
379
285
  ```
380
286
 
381
287
  | Prop | Tipo | Padrão |
382
288
  |---|---|---|
383
- | `modelValue` | `File \| File[] \| null` | `null` |
289
+ | `modelValue` | `File \| File[] \| null` | `null` |
384
290
  | `label` | `string` | `''` |
385
291
  | `placeholder` | `string` | `'Arraste e solte o arquivo aqui'` |
386
292
  | `required` | `boolean` | `false` |
@@ -397,8 +303,8 @@ function enviarArquivos(files: File[]) {
397
303
  Eventos: `update:modelValue`, `select`, `change`, `remove`, `clear` e `error`.
398
304
  Erros de tipo, tamanho e quantidade possuem `code`, `message` e o `file`
399
305
  relacionado. Os slots `empty` e `preview` permitem customizar a área vazia e a
400
- pré-visualização. Os métodos `choose()` e `clear()` ficam disponíveis pela ref
401
- do componente.
306
+ pré-visualização. Os métodos `choose()` e `clear()` ficam disponíveis pela ref
307
+ do componente.
402
308
 
403
309
  ## TopInputText
404
310
 
@@ -507,6 +413,59 @@ O texto das opções é limitado visualmente pela largura disponível do painel,
507
413
  sem corte por quantidade fixa de caracteres; o tooltip padrão exibe o valor
508
414
  completo quando `showTooltip` está ativo.
509
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
+
510
469
  ## Desenvolvimento da biblioteca
511
470
 
512
471
  ```bash
@@ -533,7 +492,7 @@ npm run storybook
533
492
  ```
534
493
 
535
494
  Abra `http://localhost:6006` para acessar as histórias de `TopButton`,
536
- `TopConfirmDialog`, `TopDatePicker`, `TopInputText` e `TopSelect`. Use o botão de
495
+ `TopConfirmDialog`, `TopDatePicker`, `TopInputText`, `TopSelect` e `TopTabs`. Use o botão de
537
496
  contraste na barra superior para alternar o preview entre tema claro e escuro.
538
497
  Para gerar a versão estática da documentação, execute:
539
498