@topjoao/top-design-system 0.1.0-beta.2 → 0.1.0-beta.20
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 +743 -135
- package/dist/TopToast-CJpXTbO3.cjs +2 -0
- package/dist/TopToast-CJpXTbO3.cjs.map +1 -0
- package/dist/TopToast-SOmpzVY5.js +2414 -0
- package/dist/TopToast-SOmpzVY5.js.map +1 -0
- package/dist/components/TopButton.vue.d.ts +4 -1
- package/dist/components/TopConfirmDialog.vue.d.ts +47 -0
- package/dist/components/TopDatePicker.vue.d.ts +81 -0
- package/dist/components/TopFileUpload.vue.d.ts +88 -0
- package/dist/components/TopInputText.vue.d.ts +24 -0
- package/dist/components/TopNavBar.vue.d.ts +269 -0
- package/dist/components/TopSelect.vue.d.ts +100 -0
- package/dist/components/TopTabs.vue.d.ts +34 -0
- package/dist/components/TopToast.vue.d.ts +37 -0
- package/dist/components/internal/TopNavMobileTree.vue.d.ts +20 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +15 -0
- package/dist/index.js +12 -70
- package/dist/index.js.map +1 -1
- package/dist/nuxt.cjs +1 -1
- package/dist/nuxt.cjs.map +1 -1
- package/dist/nuxt.js +28 -0
- package/dist/nuxt.js.map +1 -1
- package/dist/plugin.cjs +1 -1
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.ts +16 -0
- package/dist/plugin.js +4 -4
- package/dist/plugin.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/theme/topSolutions.d.ts +7 -0
- package/package.json +91 -84
- package/dist/TopButton-9IIdtUbJ.js +0 -81
- package/dist/TopButton-9IIdtUbJ.js.map +0 -1
- package/dist/TopButton-CDKgguLF.cjs +0 -2
- package/dist/TopButton-CDKgguLF.cjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,135 +1,743 @@
|
|
|
1
|
-
# TopSolutions Design System
|
|
2
|
-
|
|
3
|
-
Biblioteca de componentes Vue 3, estilos e tokens visuais compartilhados pela
|
|
4
|
-
TopSolutions.
|
|
5
|
-
|
|
6
|
-
## Instalação
|
|
7
|
-
|
|
8
|
-
```bash
|
|
9
|
-
npm install @topjoao/top-design-system@beta
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
A aplicação consumidora deve possuir Vue 3, PrimeVue, PrimeIcons e
|
|
13
|
-
`@primeuix/themes` em versões compatíveis com as `peerDependencies` do pacote.
|
|
14
|
-
|
|
15
|
-
##
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
</
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
1
|
+
# TopSolutions Design System
|
|
2
|
+
|
|
3
|
+
Biblioteca de componentes Vue 3, estilos e tokens visuais compartilhados pela
|
|
4
|
+
TopSolutions.
|
|
5
|
+
|
|
6
|
+
## Instalação
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
npm install @topjoao/top-design-system@beta
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
A aplicação consumidora deve possuir Vue 3, PrimeVue, PrimeIcons e
|
|
13
|
+
`@primeuix/themes` em versões compatíveis com as `peerDependencies` do pacote.
|
|
14
|
+
|
|
15
|
+
## Tema TopSolutions
|
|
16
|
+
|
|
17
|
+
A biblioteca exporta `TopSolutionsPreset`, o preset PrimeVue baseado na paleta
|
|
18
|
+
oficial da TopSolutions. Configure-o uma vez na aplicação consumidora:
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import PrimeVue from 'primevue/config'
|
|
22
|
+
import { TopSolutionsPreset } from '@topjoao/top-design-system'
|
|
23
|
+
|
|
24
|
+
app.use(PrimeVue, {
|
|
25
|
+
theme: {
|
|
26
|
+
preset: TopSolutionsPreset,
|
|
27
|
+
options: { darkModeSelector: '.dark' },
|
|
28
|
+
},
|
|
29
|
+
})
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Para ativar o modo escuro, adicione ou remova `.dark` uma única vez no elemento
|
|
33
|
+
`<html>` da aplicação. Os componentes usam tokens semânticos de superfície, texto e
|
|
34
|
+
borda fornecidos por `style.css`; não é necessário passar classes `dark:` em cada
|
|
35
|
+
uso. A aplicação pode substituir esses tokens após importar o CSS da biblioteca.
|
|
36
|
+
|
|
37
|
+
Os tokens públicos de campos são `--top-field-background`,
|
|
38
|
+
`--top-field-background-readonly`, `--top-field-background-disabled`,
|
|
39
|
+
`--top-field-text`, `--top-field-label`, `--top-field-placeholder`,
|
|
40
|
+
`--top-field-border`, `--top-field-border-hover` e `--top-field-icon`.
|
|
41
|
+
|
|
42
|
+
O preset é independente dos ajustes de layout próprios do TopLicita; ele
|
|
43
|
+
contém apenas tokens semânticos compartilháveis, como cores primárias, neutras,
|
|
44
|
+
sucesso, alerta e erro.
|
|
45
|
+
|
|
46
|
+
`style.css` contém somente os estilos dos componentes públicos do Design System.
|
|
47
|
+
Regras que
|
|
48
|
+
alcançam o PrimeVue são encapsuladas pelas classes-raiz desses componentes;
|
|
49
|
+
componentes PrimeVue usados diretamente pela aplicação consumidora não são
|
|
50
|
+
sobrescritos pela biblioteca.
|
|
51
|
+
|
|
52
|
+
## Uso com Nuxt
|
|
53
|
+
|
|
54
|
+
Adicione o módulo uma única vez ao `nuxt.config.ts`:
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
export default defineNuxtConfig({
|
|
58
|
+
modules: [
|
|
59
|
+
// outros módulos...
|
|
60
|
+
'@topjoao/top-design-system/nuxt',
|
|
61
|
+
],
|
|
62
|
+
})
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Depois de alterar a configuração, reinicie o servidor de desenvolvimento ou
|
|
66
|
+
regenere os arquivos do Nuxt:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npm run postinstall
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
O módulo registra os componentes, gera suas tipagens e inclui o CSS da
|
|
73
|
+
biblioteca. Não é necessário importar o componente manualmente:
|
|
74
|
+
|
|
75
|
+
```vue
|
|
76
|
+
<template>
|
|
77
|
+
<TopButton label="Salvar" icon="pi pi-save" />
|
|
78
|
+
</template>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Uso com Vue 3
|
|
82
|
+
|
|
83
|
+
### Importação por componente
|
|
84
|
+
|
|
85
|
+
```vue
|
|
86
|
+
<script setup lang="ts">
|
|
87
|
+
import { TopButton } from '@topjoao/top-design-system'
|
|
88
|
+
import '@topjoao/top-design-system/style.css'
|
|
89
|
+
</script>
|
|
90
|
+
|
|
91
|
+
<template>
|
|
92
|
+
<TopButton label="Salvar" icon="pi pi-save" />
|
|
93
|
+
</template>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Registro global
|
|
97
|
+
|
|
98
|
+
Na inicialização da aplicação:
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
import { createApp } from 'vue'
|
|
102
|
+
import { TopSolutionsDesignSystem } from '@topjoao/top-design-system/plugin'
|
|
103
|
+
import '@topjoao/top-design-system/style.css'
|
|
104
|
+
import App from './App.vue'
|
|
105
|
+
|
|
106
|
+
createApp(App).use(TopSolutionsDesignSystem).mount('#app')
|
|
107
|
+
```
|
|
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
|
+
No Drawer, `mobileActiveBackground`, `mobileActiveTextColor`,
|
|
299
|
+
e `mobileDividerColor` controlam respectivamente o módulo ativo e os
|
|
300
|
+
separadores horizontais.
|
|
301
|
+
|
|
302
|
+
A biblioteca não fixa tipografia inline. Por padrão, família, tamanho, peso e
|
|
303
|
+
altura de linha são herdados da aplicação consumidora. Além disso, `appearance`
|
|
304
|
+
só cria variáveis inline para propriedades que foram realmente informadas; os
|
|
305
|
+
valores fiéis ao AppSidebar existem apenas como *fallbacks* no CSS. Assim, um
|
|
306
|
+
tema global pode controlar o componente sem precisar usar `!important`:
|
|
307
|
+
|
|
308
|
+
```css
|
|
309
|
+
:root {
|
|
310
|
+
--top-nav-font-family: var(--app-font-family);
|
|
311
|
+
--top-nav-font-size: var(--app-font-size);
|
|
312
|
+
--top-nav-strong-font-weight: 600;
|
|
313
|
+
--top-nav-action-size: 2.5rem;
|
|
314
|
+
--top-nav-header-padding: 0.625rem 1.5rem;
|
|
315
|
+
--top-nav-menu-item-padding: 0.5rem 0.75rem;
|
|
316
|
+
--top-nav-section-width: 16rem;
|
|
317
|
+
--top-nav-column-width: 18rem;
|
|
318
|
+
--top-nav-mobile-active-bg: #fff;
|
|
319
|
+
--top-nav-mobile-active-fg: #025a84;
|
|
320
|
+
--top-nav-mobile-divider: rgb(255 255 255 / 20%);
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
As variáveis globais também alcançam o Drawer teleportado. Um valor passado por
|
|
325
|
+
`appearance` tem precedência local e não altera os demais tokens do tema.
|
|
326
|
+
|
|
327
|
+
O breakpoint móvel é `1024px`. No desktop, um `ResizeObserver` reaplica a mesma
|
|
328
|
+
sequência progressiva do AppSidebar: ações colapsam abaixo de `1440px`, busca
|
|
329
|
+
vira ícone abaixo de `1320px`, nome do usuário some abaixo de `1180px` e, se o
|
|
330
|
+
conteúdo ainda transbordar, o contexto recebe `compact: true`. O último estágio
|
|
331
|
+
também limita o contêiner do contexto a `3.25rem`; use `context-compact` quando
|
|
332
|
+
quiser controlar exatamente o que permanece visível.
|
|
333
|
+
|
|
334
|
+
Abaixo de `1024px`, a navegação desktop desaparece e o Drawer do PrimeVue assume.
|
|
335
|
+
Ele mantém cabeçalho, busca, ações, trilho translúcido rolável, árvore recursiva,
|
|
336
|
+
favoritos e usuário. A transição `menu-expand` existe somente dentro do Drawer;
|
|
337
|
+
os dropdowns desktop abrem sem animação e suas áreas de hover incluem o espaço
|
|
338
|
+
entre gatilho e painel.
|
|
339
|
+
|
|
340
|
+
## TopButton
|
|
341
|
+
|
|
342
|
+
Exemplo
|
|
343
|
+
|
|
344
|
+
```vue
|
|
345
|
+
<template>
|
|
346
|
+
<TopButton label="Salvar" icon="pi pi-save" @click="salvar" />
|
|
347
|
+
<TopButton label="Cancelar" secondary />
|
|
348
|
+
<TopButton label="Excluir" severity="danger" />
|
|
349
|
+
|
|
350
|
+
<TopButton label="Consultar" outlined>
|
|
351
|
+
<template #icon>
|
|
352
|
+
<i class="pi pi-search" />
|
|
353
|
+
</template>
|
|
354
|
+
</TopButton>
|
|
355
|
+
</template>
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
| Prop | Tipo | Padrão |
|
|
359
|
+
|---|---|---|
|
|
360
|
+
| `tooltip` | `string` | `''` |
|
|
361
|
+
| `tooltipClass` | `string` | `'text-xs'` |
|
|
362
|
+
| `label` | `string` | `''` |
|
|
363
|
+
| `icon` | `string` | `''` |
|
|
364
|
+
| `loading` | `boolean` | `false` |
|
|
365
|
+
| `class` | `string` | `''` |
|
|
366
|
+
| `outlined` | `boolean` | `false` |
|
|
367
|
+
| `severity` | `'primary' \| 'secondary' \| 'success' \| 'warn' \| 'danger'` | `'primary'` |
|
|
368
|
+
| `secondary` | `boolean` | `false` |
|
|
369
|
+
| `disabled` | `boolean` | `false` |
|
|
370
|
+
| `unstyled` | `boolean` | `false` |
|
|
371
|
+
| `type` | `'button' \| 'submit' \| 'reset'` | `'button'` |
|
|
372
|
+
|
|
373
|
+
O componente emite `click` sem payload e oferece o slot nomeado `icon`.
|
|
374
|
+
`secondary` permanece como atalho compatível para `severity="secondary"`.
|
|
375
|
+
|
|
376
|
+
## TopConfirmDialog
|
|
377
|
+
|
|
378
|
+
Diálogo de confirmação baseado no `Dialog` do PrimeVue e nos botões do Design
|
|
379
|
+
System. A visibilidade é controlada por `v-model`; a aplicação consumidora
|
|
380
|
+
decide o que executar e quando encerrar após a confirmação.
|
|
381
|
+
|
|
382
|
+
```vue
|
|
383
|
+
<script setup lang="ts">
|
|
384
|
+
import { ref } from 'vue'
|
|
385
|
+
import { TopConfirmDialog } from '@topjoao/top-design-system'
|
|
386
|
+
|
|
387
|
+
const showConfirm = ref(false)
|
|
388
|
+
|
|
389
|
+
function excluirRegistro() {
|
|
390
|
+
// Execute a ação e feche o diálogo quando apropriado.
|
|
391
|
+
showConfirm.value = false
|
|
392
|
+
}
|
|
393
|
+
</script>
|
|
394
|
+
|
|
395
|
+
<template>
|
|
396
|
+
<TopConfirmDialog
|
|
397
|
+
v-model="showConfirm"
|
|
398
|
+
title="Confirmar exclusão"
|
|
399
|
+
message="Deseja realmente excluir este registro?"
|
|
400
|
+
confirm-text="Excluir"
|
|
401
|
+
cancel-text="Cancelar"
|
|
402
|
+
@confirm="excluirRegistro"
|
|
403
|
+
/>
|
|
404
|
+
</template>
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
| Prop | Tipo | Padrão |
|
|
408
|
+
|---|---|---|
|
|
409
|
+
| `modelValue` | `boolean` | `false` |
|
|
410
|
+
| `title` | `string` | `'Confirmar'` |
|
|
411
|
+
| `message` | `string` | `''` |
|
|
412
|
+
| `confirmText` / `cancelText` | `string` | `'Confirmar'` / `'Cancelar'` |
|
|
413
|
+
| `loading` | `boolean` | `false` |
|
|
414
|
+
| `loadingText` | `string` | `'Processando...'` |
|
|
415
|
+
| `severity` | `'primary' \| 'danger'` | `'danger'` |
|
|
416
|
+
| `icon` | `string` | `'pi pi-exclamation-triangle'` |
|
|
417
|
+
|
|
418
|
+
Eventos: `update:modelValue`, `confirm`, `cancel` e `close`. O evento `confirm`
|
|
419
|
+
não fecha automaticamente o diálogo, permitindo que a aplicação aguarde uma
|
|
420
|
+
operação assíncrona. Os slots `message` e default permitem substituir a mensagem
|
|
421
|
+
textual.
|
|
422
|
+
|
|
423
|
+
## TopDatePicker
|
|
424
|
+
|
|
425
|
+
Seletor de datas baseado no `DatePicker` do PrimeVue. O valor permanece como
|
|
426
|
+
`Date` (ou arrays de `Date` nos modos `multiple` e `range`); `dateFormat` altera
|
|
427
|
+
somente a apresentação no campo e não converte o `v-model` para texto.
|
|
428
|
+
No modo padrão (`single` com `dd/mm/yy`), a digitação recebe automaticamente a
|
|
429
|
+
máscara brasileira `dd/mm/aaaa`.
|
|
430
|
+
|
|
431
|
+
```vue
|
|
432
|
+
<script setup lang="ts">
|
|
433
|
+
import { ref } from 'vue'
|
|
434
|
+
import { TopDatePicker } from '@topjoao/top-design-system'
|
|
435
|
+
|
|
436
|
+
const dataNascimento = ref<Date | null>(null)
|
|
437
|
+
</script>
|
|
438
|
+
|
|
439
|
+
<template>
|
|
440
|
+
<TopDatePicker
|
|
441
|
+
v-model="dataNascimento"
|
|
442
|
+
label="Data de nascimento"
|
|
443
|
+
placeholder="Selecione a data"
|
|
444
|
+
:max-date="new Date()"
|
|
445
|
+
required
|
|
446
|
+
error="Informe uma data válida."
|
|
447
|
+
@date-select="validarData"
|
|
448
|
+
/>
|
|
449
|
+
</template>
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
| Prop | Tipo | Padrão |
|
|
453
|
+
|---|---|---|
|
|
454
|
+
| `modelValue` | `Date \| Date[] \| (Date \| null)[] \| null` | `null` |
|
|
455
|
+
| `label` | `string` | `''` |
|
|
456
|
+
| `placeholder` | `string` | `'dd/mm/aaaa'` |
|
|
457
|
+
| `required` | `boolean` | `false` |
|
|
458
|
+
| `error` | `string` | `''` |
|
|
459
|
+
| `invalid` | `boolean` | `false` |
|
|
460
|
+
| `disabled` | `boolean` | `false` |
|
|
461
|
+
| `readonly` | `boolean` | `false` |
|
|
462
|
+
| `selectionMode` | `'single' \| 'multiple' \| 'range'` | `'single'` |
|
|
463
|
+
| `dateFormat` | `string` | `'dd/mm/yy'` |
|
|
464
|
+
| `minDate` / `maxDate` | `Date` | `undefined` |
|
|
465
|
+
| `showIcon` | `boolean` | `true` |
|
|
466
|
+
| `iconDisplay` | `'button' \| 'input'` | `'input'` |
|
|
467
|
+
| `manualInput` | `boolean` | `true` |
|
|
468
|
+
| `showButtonBar` | `boolean` | `false` |
|
|
469
|
+
| `appendTo` | `'body' \| 'self' \| HTMLElement` | `'body'` |
|
|
470
|
+
|
|
471
|
+
Eventos: `update:modelValue`, `input`, `change`, `date-select`, `show`, `hide`,
|
|
472
|
+
`today-click`, `clear-click`, `month-change`, `year-change`, `focus`, `blur` e
|
|
473
|
+
`keydown`. Os slots do `DatePicker` do PrimeVue são repassados pelo wrapper,
|
|
474
|
+
incluindo `date`, `header`, `footer`, `buttonbar`, `inputicon`, `dropdownicon`,
|
|
475
|
+
`previcon` e `nexticon`.
|
|
476
|
+
|
|
477
|
+
`required` adiciona o atributo nativo e o asterisco visual; a validação continua
|
|
478
|
+
sob responsabilidade da aplicação. `error` ativa o estado inválido, associa a
|
|
479
|
+
mensagem ao input com atributos ARIA e a exibe abaixo do campo. `readonly`
|
|
480
|
+
impede edição e seleção sem desabilitar o controle, enquanto `disabled` remove a
|
|
481
|
+
interação. No modo escuro, o campo usa os tokens públicos `--top-field-*`.
|
|
482
|
+
|
|
483
|
+
## TopFileUpload
|
|
484
|
+
|
|
485
|
+
Seletor de arquivos baseado no `FileUpload` do PrimeVue. O componente valida e
|
|
486
|
+
apresenta os arquivos, mas não os envia: a aplicação consumidora controla o
|
|
487
|
+
upload por `v-model` e pelos eventos.
|
|
488
|
+
|
|
489
|
+
```vue
|
|
490
|
+
<script setup lang="ts">
|
|
491
|
+
import { ref } from 'vue'
|
|
492
|
+
import { TopFileUpload } from '@topjoao/top-design-system'
|
|
493
|
+
|
|
494
|
+
const anexos = ref<File[]>([])
|
|
495
|
+
|
|
496
|
+
function enviarArquivos(files: File[]) {
|
|
497
|
+
// Envie os arquivos usando o serviço da aplicação.
|
|
498
|
+
}
|
|
499
|
+
</script>
|
|
500
|
+
|
|
501
|
+
<template>
|
|
502
|
+
<TopFileUpload
|
|
503
|
+
v-model="anexos"
|
|
504
|
+
label="Anexos"
|
|
505
|
+
accept=".pdf,image/*"
|
|
506
|
+
multiple
|
|
507
|
+
:max-file-size="5 * 1024 * 1024"
|
|
508
|
+
:max-files="5"
|
|
509
|
+
required
|
|
510
|
+
@select="enviarArquivos"
|
|
511
|
+
/>
|
|
512
|
+
</template>
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
| Prop | Tipo | Padrão |
|
|
516
|
+
|---|---|---|
|
|
517
|
+
| `modelValue` | `File \| File[] \| null` | `null` |
|
|
518
|
+
| `label` | `string` | `''` |
|
|
519
|
+
| `placeholder` | `string` | `'Arraste e solte o arquivo aqui'` |
|
|
520
|
+
| `required` | `boolean` | `false` |
|
|
521
|
+
| `disabled` | `boolean` | `false` |
|
|
522
|
+
| `accept` | `string` | `''` |
|
|
523
|
+
| `multiple` | `boolean` | `false` |
|
|
524
|
+
| `maxFileSize` | `number \| null` (bytes) | `null` |
|
|
525
|
+
| `maxFiles` | `number \| null` | `null` |
|
|
526
|
+
| `error` | `string` | `''` |
|
|
527
|
+
| `selectLabel` | `string` | `'Selecionar arquivo'` |
|
|
528
|
+
| `removeLabel` | `string` | `'Remover'` |
|
|
529
|
+
| `loading` | `boolean` | `false` |
|
|
530
|
+
|
|
531
|
+
Eventos: `update:modelValue`, `select`, `change`, `remove`, `clear` e `error`.
|
|
532
|
+
Erros de tipo, tamanho e quantidade possuem `code`, `message` e o `file`
|
|
533
|
+
relacionado. Os slots `empty` e `preview` permitem customizar a área vazia e a
|
|
534
|
+
pré-visualização. Os métodos `choose()` e `clear()` ficam disponíveis pela ref
|
|
535
|
+
do componente.
|
|
536
|
+
|
|
537
|
+
## TopInputText
|
|
538
|
+
|
|
539
|
+
Campo textual baseado no `InputText` do PrimeVue. O `v-model` é sempre
|
|
540
|
+
`string`, inclusive para códigos, documentos e identificadores compostos
|
|
541
|
+
somente por dígitos; por exemplo, `"001234"` preserva os zeros à esquerda.
|
|
542
|
+
|
|
543
|
+
```vue
|
|
544
|
+
<script setup lang="ts">
|
|
545
|
+
import { ref } from 'vue'
|
|
546
|
+
import { TopInputText } from '@topjoao/top-design-system'
|
|
547
|
+
|
|
548
|
+
const codigo = ref('001234')
|
|
549
|
+
</script>
|
|
550
|
+
|
|
551
|
+
<template>
|
|
552
|
+
<TopInputText
|
|
553
|
+
id="codigo"
|
|
554
|
+
v-model="codigo"
|
|
555
|
+
label="Código"
|
|
556
|
+
placeholder="Digite o código"
|
|
557
|
+
required
|
|
558
|
+
maxlength="10"
|
|
559
|
+
autocomplete="off"
|
|
560
|
+
/>
|
|
561
|
+
</template>
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
| Prop | Tipo | Padrão |
|
|
565
|
+
|---|---|---|
|
|
566
|
+
| `modelValue` | `string` | `''` |
|
|
567
|
+
| `label` | `string` | `''` |
|
|
568
|
+
| `placeholder` | `string` | `''` |
|
|
569
|
+
| `required` | `boolean` | `false` |
|
|
570
|
+
| `error` | `string` | `''` |
|
|
571
|
+
| `disabled` | `boolean` | `false` |
|
|
572
|
+
| `readonly` | `boolean` | `false` |
|
|
573
|
+
|
|
574
|
+
Atributos e eventos nativos adicionais, como `name`, `maxlength`,
|
|
575
|
+
`autocomplete`, `inputmode`, `pattern`, `aria-*`, `data-*`, `focus` e `blur`,
|
|
576
|
+
são repassados ao elemento `input` interno.
|
|
577
|
+
|
|
578
|
+
## TopSelect
|
|
579
|
+
|
|
580
|
+
Seletor pesquisável baseado no `AutoComplete` do PrimeVue. Ele é genérico: a
|
|
581
|
+
aplicação fornece os itens, executa a busca e decide qualquer apresentação de
|
|
582
|
+
domínio por slots.
|
|
583
|
+
|
|
584
|
+
```vue
|
|
585
|
+
<script setup lang="ts">
|
|
586
|
+
import { ref } from 'vue'
|
|
587
|
+
import { TopSelect } from '@topjoao/top-design-system'
|
|
588
|
+
|
|
589
|
+
const selectedCustomer = ref(null)
|
|
590
|
+
const customers = ref([])
|
|
591
|
+
|
|
592
|
+
function searchCustomers({ query }: { query: string }) {
|
|
593
|
+
// Atualize customers com o resultado da sua fonte de dados.
|
|
594
|
+
}
|
|
595
|
+
</script>
|
|
596
|
+
|
|
597
|
+
<template>
|
|
598
|
+
<TopSelect
|
|
599
|
+
v-model="selectedCustomer"
|
|
600
|
+
:options="customers"
|
|
601
|
+
option-label="name"
|
|
602
|
+
option-key="id"
|
|
603
|
+
option-prefix="code"
|
|
604
|
+
show-option-prefix
|
|
605
|
+
:loading="false"
|
|
606
|
+
@search="searchCustomers"
|
|
607
|
+
>
|
|
608
|
+
<template #icon="{ loading }">
|
|
609
|
+
<i :class="loading ? 'pi pi-spin pi-spinner' : 'pi pi-users'" />
|
|
610
|
+
</template>
|
|
611
|
+
<template #footer>
|
|
612
|
+
<button type="button">Criar cliente</button>
|
|
613
|
+
</template>
|
|
614
|
+
</TopSelect>
|
|
615
|
+
</template>
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
| Prop | Tipo | Padrão |
|
|
619
|
+
|---|---|---|
|
|
620
|
+
| `options` | `array` | `[]` |
|
|
621
|
+
| `optionLabel` | `string \| function` | `'label'` |
|
|
622
|
+
| `optionKey` | `string` | `'id'` |
|
|
623
|
+
| `optionPrefix` | `string` | `''` |
|
|
624
|
+
| `showOptionPrefix` | `boolean` | `false` |
|
|
625
|
+
| `showSelectedPrefix` | `boolean` | `false` |
|
|
626
|
+
| `loading` / `disabled` / `invalid` | `boolean` | `false` |
|
|
627
|
+
| `placeholder` | `string` | `'Search...'` |
|
|
628
|
+
| `minQueryLength` | `number` | `1` |
|
|
629
|
+
| `multiple` / `forceSelection` | `boolean` | `false` / `true` |
|
|
630
|
+
| `panelWidth` / `scrollHeight` | `string` | `null` / `'250px'` |
|
|
631
|
+
| `emptyMessage` / `loadingMessage` | `string` | mensagens padrão em inglês |
|
|
632
|
+
| `closeOnSelect` | `boolean` | `false` |
|
|
633
|
+
|
|
634
|
+
Eventos: `update:modelValue`, `search`, `loadMore`, `clear`, `select` e
|
|
635
|
+
`change`.
|
|
636
|
+
|
|
637
|
+
Slots: `icon`, `option`, `selected-item`, `chip`, `empty`, `option-group` e
|
|
638
|
+
`footer`. O slot `icon` recebe `loading`; sem ele, o componente mostra uma lupa
|
|
639
|
+
ou um indicador de carregamento. Quando um slot não é informado, o componente usa sua apresentação padrão.
|
|
640
|
+
O texto das opções é limitado visualmente pela largura disponível do painel,
|
|
641
|
+
sem corte por quantidade fixa de caracteres; o tooltip padrão exibe o valor
|
|
642
|
+
completo quando `showTooltip` está ativo.
|
|
643
|
+
|
|
644
|
+
## TopTabs
|
|
645
|
+
|
|
646
|
+
Navegação em abas baseada em `Tabs`, `TabList`, `Tab`, `TabPanels` e `TabPanel`
|
|
647
|
+
do PrimeVue, com estrutura simplificada e estilos dos temas claro e escuro do
|
|
648
|
+
Design System.
|
|
649
|
+
|
|
650
|
+
```vue
|
|
651
|
+
<script setup lang="ts">
|
|
652
|
+
import { ref } from 'vue'
|
|
653
|
+
import {
|
|
654
|
+
TopTabs,
|
|
655
|
+
type TopTabItem,
|
|
656
|
+
type TopTabValue,
|
|
657
|
+
} from '@topjoao/top-design-system'
|
|
658
|
+
|
|
659
|
+
const activeTab = ref<TopTabValue>('dados')
|
|
660
|
+
const tabs: TopTabItem[] = [
|
|
661
|
+
{ value: 'dados', label: 'Dados' },
|
|
662
|
+
{ value: 'documentos', label: 'Documentos' },
|
|
663
|
+
{ value: 'auditoria', label: 'Auditoria', disabled: true },
|
|
664
|
+
]
|
|
665
|
+
</script>
|
|
666
|
+
|
|
667
|
+
<template>
|
|
668
|
+
<TopTabs v-model="activeTab" :tabs="tabs">
|
|
669
|
+
<template #dados>
|
|
670
|
+
Dados gerais do processo
|
|
671
|
+
</template>
|
|
672
|
+
|
|
673
|
+
<template #documentos>
|
|
674
|
+
Documentos anexados
|
|
675
|
+
</template>
|
|
676
|
+
|
|
677
|
+
<template #auditoria>
|
|
678
|
+
Histórico de auditoria
|
|
679
|
+
</template>
|
|
680
|
+
</TopTabs>
|
|
681
|
+
</template>
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
| Prop | Tipo | Padrão |
|
|
685
|
+
|---|---|---|
|
|
686
|
+
| `modelValue` | `string \| number` | obrigatório |
|
|
687
|
+
| `tabs` | `TopTabItem[]` | obrigatório |
|
|
688
|
+
| `lazy` | `boolean` | `false` |
|
|
689
|
+
| `scrollable` | `boolean` | `true` |
|
|
690
|
+
|
|
691
|
+
Cada `TopTabItem` possui `value`, `label` e `disabled?`. O `value` deve ser
|
|
692
|
+
único e identifica tanto a seleção quanto o slot do painel; por exemplo,
|
|
693
|
+
`value: 'documentos'` utiliza `#documentos`. Cada slot recebe `tab` e `active`.
|
|
694
|
+
O componente emite somente `update:modelValue`. Atributos adicionais, incluindo
|
|
695
|
+
as opções de passthrough do PrimeVue, são repassados ao componente `Tabs`.
|
|
696
|
+
|
|
697
|
+
## Desenvolvimento da biblioteca
|
|
698
|
+
|
|
699
|
+
```bash
|
|
700
|
+
npm install
|
|
701
|
+
npm run check
|
|
702
|
+
```
|
|
703
|
+
|
|
704
|
+
O comando `check` executa verificação de tipos, testes e build.
|
|
705
|
+
|
|
706
|
+
Para inspecionar o conteúdo que seria publicado:
|
|
707
|
+
|
|
708
|
+
```bash
|
|
709
|
+
npm pack --dry-run
|
|
710
|
+
```
|
|
711
|
+
|
|
712
|
+
## Playground visual
|
|
713
|
+
|
|
714
|
+
O Storybook permite testar os componentes isoladamente e consultar seus
|
|
715
|
+
exemplos. Ele é uma dependência de desenvolvimento e não é incluído no pacote
|
|
716
|
+
publicado.
|
|
717
|
+
|
|
718
|
+
```bash
|
|
719
|
+
npm run storybook
|
|
720
|
+
```
|
|
721
|
+
|
|
722
|
+
Abra `http://localhost:6006` para acessar as histórias de `TopButton`,
|
|
723
|
+
`TopConfirmDialog`, `TopDatePicker`, `TopInputText`, `TopSelect` e `TopTabs`. Use o botão de
|
|
724
|
+
contraste na barra superior para alternar o preview entre tema claro e escuro.
|
|
725
|
+
Para gerar a versão estática da documentação, execute:
|
|
726
|
+
|
|
727
|
+
```bash
|
|
728
|
+
npm run build-storybook
|
|
729
|
+
```
|
|
730
|
+
|
|
731
|
+
Para gerar um pacote local instalável:
|
|
732
|
+
|
|
733
|
+
```bash
|
|
734
|
+
npm pack
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
Para publicar uma nova versão beta, primeiro altere a versão; versões já
|
|
738
|
+
publicadas no npm não podem ser sobrescritas.
|
|
739
|
+
|
|
740
|
+
```bash
|
|
741
|
+
npm version prerelease --preid=beta --no-git-tag-version
|
|
742
|
+
npm publish --access public --tag beta
|
|
743
|
+
```
|