@seniorsistemas/angular-components 19.3.3 → 19.3.4
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/accordion/README.md +166 -0
- package/alert/README.md +92 -0
- package/autocomplete/README.md +162 -0
- package/badge/README.md +126 -0
- package/bignumber-input/README.md +122 -0
- package/breadcrumb/README.md +144 -0
- package/button/README.md +159 -0
- package/calendar-mask/README.md +89 -0
- package/card/README.md +133 -0
- package/chat/README.md +130 -0
- package/checkbox/README.md +108 -0
- package/checkbox-list/README.md +149 -0
- package/chips/README.md +152 -0
- package/code-editor/README.md +149 -0
- package/collapse-link/README.md +128 -0
- package/confirm-dialog/README.md +105 -0
- package/content-generator/README.md +111 -0
- package/control-errors/README.md +92 -0
- package/country-phone-picker/README.md +121 -0
- package/currency/README.md +90 -0
- package/custom-fields/README.md +142 -0
- package/dialog/README.md +152 -0
- package/dynamic-form/README.md +176 -0
- package/editable-overlay/README.md +98 -0
- package/empty-state/README.md +134 -0
- package/esm2022/loading-state/lib/loading-state/loading-state.component.mjs +4 -4
- package/fesm2022/seniorsistemas-angular-components-loading-state.mjs +3 -3
- package/fesm2022/seniorsistemas-angular-components-loading-state.mjs.map +1 -1
- package/fieldset/README.md +135 -0
- package/file-picker/README.md +162 -0
- package/file-upload/README.md +23 -7
- package/gantt/README.md +173 -0
- package/global-search/README.md +151 -0
- package/grid-menu/README.md +123 -0
- package/help-popover/README.md +134 -0
- package/ia-insight/README.md +24 -6
- package/image-cropper/README.md +140 -0
- package/infinite-scroll/README.md +130 -0
- package/info-sign/README.md +111 -0
- package/inline-edit/README.md +139 -0
- package/insights/README.md +159 -0
- package/interactive-content/README.md +120 -0
- package/kanban/README.md +184 -0
- package/label-value/README.md +154 -0
- package/loading-state/README.md +141 -0
- package/localized-number-input/README.md +128 -0
- package/mouse-events/README.md +157 -0
- package/navigation-button/README.md +160 -0
- package/numeric/README.md +147 -0
- package/numeric-mask/README.md +170 -0
- package/object-card/README.md +158 -0
- package/package.json +1 -1
- package/paginator/README.md +121 -0
- package/panel/README.md +147 -0
- package/password-strength/README.md +144 -0
- package/picklist/README.md +170 -0
- package/pin-code-field/README.md +137 -0
- package/product-header/README.md +33 -6
- package/profile-picture-picker/README.md +159 -0
- package/progressbar/README.md +136 -0
- package/radio-button/README.md +117 -0
- package/rating-scale/README.md +154 -0
- package/select/README.md +147 -0
- package/select-button/README.md +137 -0
- package/sidebar/README.md +117 -0
- package/slide-in-bar/README.md +122 -0
- package/slider/README.md +127 -0
- package/speech-recognition/README.md +104 -0
- package/split-button/README.md +126 -0
- package/spotlight/README.md +200 -0
- package/star-rating/README.md +127 -0
- package/stats-card/README.md +135 -0
- package/stepper/README.md +164 -0
- package/switch/README.md +125 -0
- package/table/README.md +185 -0
- package/text-area-ia/README.md +17 -6
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# ObjectCard
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Componente de card para exibição de um objeto de análise com cabeçalho principal, campos adicionais e painel expansível. Distribui automaticamente os campos visíveis conforme a largura disponível e suporta nível de severidade visual.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Listar entidades de negócio (funcionários, contratos, produtos, servidores) com atributos estruturados
|
|
10
|
+
- Painéis de detalhes de registros que precisam exibir múltiplas informações de forma compacta e responsiva
|
|
11
|
+
- Dashboards com indicadores de status ou alertas visuais em entidades
|
|
12
|
+
|
|
13
|
+
## Quando não usar
|
|
14
|
+
|
|
15
|
+
- Para exibir apenas métricas numéricas — use `StatsCard`
|
|
16
|
+
- Para containers genéricos de conteúdo sem estrutura de campos — use `Card` ou `Panel`
|
|
17
|
+
- Quando os dados são tabulares — use `Table`
|
|
18
|
+
|
|
19
|
+
## Instalação
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { ObjectCardModule } from '@seniorsistemas/angular-components/object-card';
|
|
23
|
+
|
|
24
|
+
@NgModule({ imports: [ObjectCardModule] })
|
|
25
|
+
export class MeuModulo {}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Uso básico
|
|
29
|
+
|
|
30
|
+
```html
|
|
31
|
+
<s-object-card>
|
|
32
|
+
<s-object-card-main
|
|
33
|
+
label="Senior Sistemas"
|
|
34
|
+
description="Tecnologia para Gestão Empresarial"
|
|
35
|
+
iconClass="fa fa-building"
|
|
36
|
+
></s-object-card-main>
|
|
37
|
+
<s-object-card-field label="Fundação" description="1988"></s-object-card-field>
|
|
38
|
+
<s-object-card-field label="Cidade" description="Blumenau - SC"></s-object-card-field>
|
|
39
|
+
</s-object-card>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## API
|
|
43
|
+
|
|
44
|
+
### Inputs (`s-object-card`)
|
|
45
|
+
|
|
46
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
47
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
48
|
+
| `id` | `string` | `'s-object-card-{n}'` | Não | Identificador do componente no DOM. Gerado automaticamente se omitido |
|
|
49
|
+
| `expanded` | `boolean` | `false` | Não | Define se o painel expansível está aberto |
|
|
50
|
+
| `expandTooltip` | `string` | `'Abrir painel'` | Não | Tooltip do botão de expandir |
|
|
51
|
+
| `collapseTooltip` | `string` | `'Fechar painel'` | Não | Tooltip do botão de colapsar |
|
|
52
|
+
| `fieldsMinWidth` | `number` | `200` | Não | Largura mínima em pixels de cada campo visível |
|
|
53
|
+
| `severity` | `Severities` | `'default'` | Não | Nível de severidade que altera o estilo da borda |
|
|
54
|
+
| `borderButtonOptions` | `BorderButtonOptions` | `undefined` | Não | Configuração do botão animado na borda lateral |
|
|
55
|
+
|
|
56
|
+
### Outputs (`s-object-card`)
|
|
57
|
+
|
|
58
|
+
| Evento | Tipo | Descrição |
|
|
59
|
+
|--------|------|-----------|
|
|
60
|
+
| `expandedChange` | `EventEmitter<boolean>` | Emitido quando o estado de expansão muda |
|
|
61
|
+
|
|
62
|
+
### Inputs (`s-object-card-main`)
|
|
63
|
+
|
|
64
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
65
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
66
|
+
| `label` | `string` | `undefined` | Não | Texto principal do cabeçalho |
|
|
67
|
+
| `description` | `string` | `undefined` | Não | Subtítulo do cabeçalho |
|
|
68
|
+
| `imageSource` | `string` | `undefined` | Não | URL da imagem do thumbnail |
|
|
69
|
+
| `imageAlt` | `string` | `undefined` | Não | Texto alternativo da imagem |
|
|
70
|
+
| `imageFallback` | `string` | `undefined` | Não | URL de imagem de fallback |
|
|
71
|
+
| `iconClass` | `string` | `'fa fa-picture-o'` | Não | Classe de ícone exibido quando não há imagem |
|
|
72
|
+
| `hasThumbnail` | `boolean` | `true` | Não | Exibe ou oculta a área de thumbnail |
|
|
73
|
+
| `hasDescription` | `boolean` | `true` | Não | Exibe ou oculta a descrição |
|
|
74
|
+
| `isBrand` | `boolean` | `false` | Não | Modo logo/marca — altera proporção do thumbnail |
|
|
75
|
+
| `buttonLabel` | `string` | `undefined` | Não | Label do botão de ações |
|
|
76
|
+
| `buttonModel` | `TieredMenuItemData[]` | `[]` | Não | Itens do menu de ações |
|
|
77
|
+
|
|
78
|
+
### Inputs (`s-object-card-field`)
|
|
79
|
+
|
|
80
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
81
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
82
|
+
| `label` | `string` | `undefined` | Não | Rótulo do campo |
|
|
83
|
+
| `description` | `string` | `undefined` | Não | Valor textual do campo |
|
|
84
|
+
| `iconClass` | `string` | `undefined` | Não | Classe de ícone exibido no campo |
|
|
85
|
+
| `buttonLabel` | `string` | `undefined` | Não | Label de botão no campo (ex: link) |
|
|
86
|
+
| `buttonModel` | `TieredMenuItemData[]` | `[]` | Não | Itens do menu do botão do campo |
|
|
87
|
+
| `badge` | `string` | `''` | Não | Texto do badge colorido |
|
|
88
|
+
| `badgeColor` | `BadgeColors` | `'blue'` | Não | Cor do badge |
|
|
89
|
+
|
|
90
|
+
### Tipos
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
type Severities = 'default' | 'info' | 'warn' | 'error' | 'success';
|
|
94
|
+
|
|
95
|
+
interface BorderButtonOptions {
|
|
96
|
+
visible?: (severity: Severities) => boolean;
|
|
97
|
+
label?: (severity: Severities) => string;
|
|
98
|
+
tooltip?: (severity: Severities) => string;
|
|
99
|
+
icon?: (severity: Severities) => string;
|
|
100
|
+
onClick?: () => void;
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Exemplos
|
|
105
|
+
|
|
106
|
+
### Com botão de ações e campos
|
|
107
|
+
|
|
108
|
+
```html
|
|
109
|
+
<s-object-card [expanded]="false" [fieldsMinWidth]="200">
|
|
110
|
+
<s-object-card-main
|
|
111
|
+
label="Colaborador"
|
|
112
|
+
description="Departamento de TI"
|
|
113
|
+
iconClass="far fa-user"
|
|
114
|
+
buttonLabel="Ações"
|
|
115
|
+
[buttonModel]="actionMenu"
|
|
116
|
+
></s-object-card-main>
|
|
117
|
+
<s-object-card-field label="Cargo" description="Desenvolvedor Frontend"></s-object-card-field>
|
|
118
|
+
<s-object-card-field label="E-mail" buttonLabel="contato@empresa.com" iconClass="fa fa-envelope"></s-object-card-field>
|
|
119
|
+
<s-object-card-field label="Status" badge="Ativo" badgeColor="green"></s-object-card-field>
|
|
120
|
+
</s-object-card>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Com severidade visual
|
|
124
|
+
|
|
125
|
+
```html
|
|
126
|
+
<s-object-card [severity]="'error'">
|
|
127
|
+
<s-object-card-main
|
|
128
|
+
label="Servidor de Produção"
|
|
129
|
+
description="Infraestrutura"
|
|
130
|
+
iconClass="fa fa-server"
|
|
131
|
+
></s-object-card-main>
|
|
132
|
+
<s-object-card-field label="CPU" description="87%"></s-object-card-field>
|
|
133
|
+
<s-object-card-field label="Status" badge="Crítico" badgeColor="red"></s-object-card-field>
|
|
134
|
+
</s-object-card>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Com template customizado no label
|
|
138
|
+
|
|
139
|
+
```html
|
|
140
|
+
<s-object-card-main description="Empresa parceira" iconClass="fa fa-building">
|
|
141
|
+
<span labelTemplate style="color: #2d7d46; font-weight: 600;">
|
|
142
|
+
<i class="fa fa-check-circle"></i> Senior Sistemas
|
|
143
|
+
</span>
|
|
144
|
+
</s-object-card-main>
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Acessibilidade
|
|
148
|
+
|
|
149
|
+
- O botão de expandir/colapsar possui tooltip acessível via `expandTooltip` e `collapseTooltip`
|
|
150
|
+
- Campos ocultos são acessíveis via teclado após expandir o painel
|
|
151
|
+
- Responsivo: em telas pequenas (≤ SM), todos os campos ficam ocultos e acessíveis via expansão
|
|
152
|
+
- Suporta navegação por teclado no botão de ações e no chevron de expansão
|
|
153
|
+
|
|
154
|
+
## Componentes relacionados
|
|
155
|
+
|
|
156
|
+
- [`Card`](../card/README.md) — container genérico de conteúdo
|
|
157
|
+
- [`StatsCard`](../stats-card/README.md) — exibição de métricas numéricas
|
|
158
|
+
- [`Thumbnail`](../thumbnail/README.md) — exibição de imagem em miniatura
|
package/package.json
CHANGED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Paginator
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Componente standalone de paginação que exibe botões de navegação de páginas, seletor de itens por página e atalhos para a primeira e última página. Emite o evento `pageChange` a cada mudança de página ou de tamanho de página.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Listagens e tabelas com dados paginados no servidor ou no cliente
|
|
10
|
+
- Sempre que o volume de registros tornar impraticável exibir tudo de uma vez
|
|
11
|
+
- Quando o usuário precisa controlar quantos itens são exibidos por página
|
|
12
|
+
|
|
13
|
+
## Quando não usar
|
|
14
|
+
|
|
15
|
+
- Para listas com poucos itens que cabem em uma única tela — exiba todos sem paginação
|
|
16
|
+
- Quando a navegação é por rolagem infinita (infinite scroll) — use um mecanismo de scroll virtual
|
|
17
|
+
|
|
18
|
+
## Instalação
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import { PaginatorComponent } from '@seniorsistemas/angular-components/paginator';
|
|
22
|
+
|
|
23
|
+
@Component({
|
|
24
|
+
standalone: true,
|
|
25
|
+
imports: [PaginatorComponent],
|
|
26
|
+
})
|
|
27
|
+
export class MeuComponent {}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Uso básico
|
|
31
|
+
|
|
32
|
+
```html
|
|
33
|
+
<s-paginator
|
|
34
|
+
[totalRecords]="total"
|
|
35
|
+
[(rows)]="tamanhoPagina"
|
|
36
|
+
(pageChange)="onPaginaMudou($event)"
|
|
37
|
+
/>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## API
|
|
41
|
+
|
|
42
|
+
### Inputs
|
|
43
|
+
|
|
44
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
45
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
46
|
+
| `totalRecords` | `number` | — | Sim | Número total de registros disponíveis para paginação |
|
|
47
|
+
| `rows` | `number` | `10` | Não | Número de itens por página. Suporta two-way binding via `[(rows)]` |
|
|
48
|
+
| `rowsPerPageOptions` | `number[]` | `[10, 20, 50, 100, 200]` | Não | Opções disponíveis no seletor de itens por página |
|
|
49
|
+
|
|
50
|
+
### Outputs
|
|
51
|
+
|
|
52
|
+
| Evento | Tipo | Descrição |
|
|
53
|
+
|--------|------|-----------|
|
|
54
|
+
| `pageChange` | `OutputEmitterRef<PageChange>` | Emitido sempre que a página atual ou o número de itens por página muda |
|
|
55
|
+
|
|
56
|
+
### Tipos
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
interface PageChange {
|
|
60
|
+
page: number; // Índice da página atual (base 0)
|
|
61
|
+
pageCount: number; // Total de páginas
|
|
62
|
+
rows: number; // Número de itens por página
|
|
63
|
+
first: number; // Índice do primeiro registro da página atual
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Exemplos
|
|
68
|
+
|
|
69
|
+
### Paginação básica
|
|
70
|
+
|
|
71
|
+
```html
|
|
72
|
+
<s-paginator
|
|
73
|
+
[totalRecords]="120"
|
|
74
|
+
[rows]="10"
|
|
75
|
+
[rowsPerPageOptions]="[10, 20, 50, 100, 200]"
|
|
76
|
+
(pageChange)="onPageChange($event)"
|
|
77
|
+
></s-paginator>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Com two-way binding nas linhas
|
|
81
|
+
|
|
82
|
+
```html
|
|
83
|
+
<s-paginator
|
|
84
|
+
[totalRecords]="totalRegistros"
|
|
85
|
+
[(rows)]="itensPorPagina"
|
|
86
|
+
(pageChange)="carregarPagina($event)"
|
|
87
|
+
></s-paginator>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Grande volume de dados
|
|
91
|
+
|
|
92
|
+
```html
|
|
93
|
+
<s-paginator
|
|
94
|
+
[totalRecords]="1000"
|
|
95
|
+
[rows]="20"
|
|
96
|
+
[rowsPerPageOptions]="[10, 20, 50, 100, 200]"
|
|
97
|
+
(pageChange)="onPageChange($event)"
|
|
98
|
+
></s-paginator>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Com opções personalizadas de itens por página
|
|
102
|
+
|
|
103
|
+
```html
|
|
104
|
+
<s-paginator
|
|
105
|
+
[totalRecords]="80"
|
|
106
|
+
[rows]="10"
|
|
107
|
+
[rowsPerPageOptions]="[5, 10, 25]"
|
|
108
|
+
(pageChange)="onPageChange($event)"
|
|
109
|
+
></s-paginator>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Acessibilidade
|
|
113
|
+
|
|
114
|
+
- Os botões de navegação (primeira página, anterior, próxima, última) são elementos `<button>` nativos com estados desabilitados declarados via `disabled`
|
|
115
|
+
- Os botões de número de página são clicáveis via teclado (Tab + Enter/Space)
|
|
116
|
+
- O seletor de itens por página usa o componente `Select` com suporte a navegação por teclado
|
|
117
|
+
|
|
118
|
+
## Componentes relacionados
|
|
119
|
+
|
|
120
|
+
- [`Table`](../table/README.md) — tabela de dados que integra o Paginator para navegação entre páginas
|
|
121
|
+
- [`Select`](../select/README.md) — componente de seleção usado internamente para o seletor de itens por página
|
package/panel/README.md
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Panel
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Componente container com cabeçalho, corpo e rodapé opcionais. Suporta colapso com animação, diferentes níveis de severidade visual na borda e templates customizáveis para cada seção via `sTemplate`.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Agrupar seções de conteúdo relacionado com título em formulários ou dashboards
|
|
10
|
+
- Seções opcionais que podem ser ocultadas pelo usuário (modo colapsável)
|
|
11
|
+
- Destacar áreas com estado de alerta, erro ou sucesso via severidade visual
|
|
12
|
+
|
|
13
|
+
## Quando não usar
|
|
14
|
+
|
|
15
|
+
- Para múltiplas seções expansíveis e exclusivas — use `Accordion`
|
|
16
|
+
- Para agrupamento de campos de formulário com borda — use `Fieldset`
|
|
17
|
+
- Para containers sem necessidade de cabeçalho ou severidade — use `Card`
|
|
18
|
+
|
|
19
|
+
## Instalação
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { PanelModule } from '@seniorsistemas/angular-components/panel';
|
|
23
|
+
|
|
24
|
+
@NgModule({ imports: [PanelModule] })
|
|
25
|
+
export class MeuModulo {}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Uso básico
|
|
29
|
+
|
|
30
|
+
```html
|
|
31
|
+
<s-panel header="Título do Painel">
|
|
32
|
+
<p>Conteúdo do painel via ng-content.</p>
|
|
33
|
+
</s-panel>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## API
|
|
37
|
+
|
|
38
|
+
### Inputs
|
|
39
|
+
|
|
40
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
41
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
42
|
+
| `header` | `string` | `undefined` | Não | Texto exibido no cabeçalho. Quando omitido, o cabeçalho não é renderizado |
|
|
43
|
+
| `toggleable` | `boolean` | `false` | Não | Exibe botão +/- no cabeçalho para colapsar/expandir o conteúdo |
|
|
44
|
+
| `collapsed` | `boolean` | `false` | Não | Define o estado inicial como colapsado. Requer `toggleable: true` |
|
|
45
|
+
| `severity` | `Severities` | `'default'` | Não | Aplica uma borda colorida lateral ao painel |
|
|
46
|
+
| `borderButtonOptions` | `BorderButtonOptions` | `undefined` | Não | Configuração do botão animado exibido na borda quando `severity` não é `'default'` |
|
|
47
|
+
| `class` | `string` | `''` | Não | Classes CSS adicionais aplicadas ao elemento raiz |
|
|
48
|
+
|
|
49
|
+
### Outputs
|
|
50
|
+
|
|
51
|
+
| Evento | Tipo | Descrição |
|
|
52
|
+
|--------|------|-----------|
|
|
53
|
+
| `collapsedChange` | `EventEmitter<boolean>` | Emitido ao colapsar ou expandir o painel. Emite o novo estado booleano |
|
|
54
|
+
|
|
55
|
+
### Tipos
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
type Severities = 'default' | 'info' | 'warn' | 'error' | 'success';
|
|
59
|
+
|
|
60
|
+
type PanelTemplateTypes = 'header' | 'body' | 'footer';
|
|
61
|
+
|
|
62
|
+
interface BorderButtonOptions {
|
|
63
|
+
visible?: (severity: Severities) => boolean;
|
|
64
|
+
label?: (severity: Severities) => string;
|
|
65
|
+
tooltip?: (severity: Severities) => string;
|
|
66
|
+
icon?: (severity: Severities) => string;
|
|
67
|
+
disabled?: (severity: Severities) => boolean;
|
|
68
|
+
onClick?: () => void;
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Exemplos
|
|
73
|
+
|
|
74
|
+
### Painel básico com cabeçalho
|
|
75
|
+
|
|
76
|
+
```html
|
|
77
|
+
<s-panel header="Informações Gerais">
|
|
78
|
+
<p>Conteúdo do painel via ng-content.</p>
|
|
79
|
+
</s-panel>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Painel colapsável
|
|
83
|
+
|
|
84
|
+
```html
|
|
85
|
+
<s-panel
|
|
86
|
+
header="Dados Adicionais"
|
|
87
|
+
[toggleable]="true"
|
|
88
|
+
[collapsed]="false"
|
|
89
|
+
(collapsedChange)="onColapsou($event)"
|
|
90
|
+
>
|
|
91
|
+
<p>Clique no +/- para colapsar ou expandir.</p>
|
|
92
|
+
</s-panel>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Painel com severidade
|
|
96
|
+
|
|
97
|
+
```html
|
|
98
|
+
<s-panel header="Atenção" severity="warn">
|
|
99
|
+
<p>Painel com borda de aviso.</p>
|
|
100
|
+
</s-panel>
|
|
101
|
+
|
|
102
|
+
<s-panel header="Erro Crítico" severity="error">
|
|
103
|
+
<p>Painel com borda de erro.</p>
|
|
104
|
+
</s-panel>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Com template customizado no cabeçalho
|
|
108
|
+
|
|
109
|
+
```html
|
|
110
|
+
<s-panel [toggleable]="true">
|
|
111
|
+
<ng-template sTemplate="header">
|
|
112
|
+
<div style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
|
|
113
|
+
<span style="font-weight: 600;">Header Customizado</span>
|
|
114
|
+
<span class="badge">Novo</span>
|
|
115
|
+
</div>
|
|
116
|
+
</ng-template>
|
|
117
|
+
<p>Conteúdo do painel.</p>
|
|
118
|
+
</s-panel>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Com template de body e footer
|
|
122
|
+
|
|
123
|
+
```html
|
|
124
|
+
<s-panel header="Painel com Footer">
|
|
125
|
+
<ng-template sTemplate="body">
|
|
126
|
+
<p>Conteúdo via sTemplate="body".</p>
|
|
127
|
+
</ng-template>
|
|
128
|
+
<ng-template sTemplate="footer">
|
|
129
|
+
<div style="display: flex; justify-content: flex-end; gap: 8px;">
|
|
130
|
+
<s-button label="Cancelar" priority="secondary"></s-button>
|
|
131
|
+
<s-button label="Salvar" priority="primary"></s-button>
|
|
132
|
+
</div>
|
|
133
|
+
</ng-template>
|
|
134
|
+
</s-panel>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Acessibilidade
|
|
138
|
+
|
|
139
|
+
- O botão de toggle (+/-) é um elemento `<button>` nativo, acessível via teclado e leitores de tela
|
|
140
|
+
- A animação de colapso usa Angular Animations e não afeta a navegação por teclado
|
|
141
|
+
- O cabeçalho customizado via `sTemplate="header"` deve garantir contraste e semântica adequados pelo implementador
|
|
142
|
+
|
|
143
|
+
## Componentes relacionados
|
|
144
|
+
|
|
145
|
+
- [`Accordion`](../accordion/README.md) — painéis expansíveis com múltiplos itens mutuamente exclusivos
|
|
146
|
+
- [`Card`](../card/README.md) — container com suporte a banner e templates
|
|
147
|
+
- [`Fieldset`](../fieldset/README.md) — agrupamento de campos de formulário
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# PasswordStrength
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Diretiva Angular que adiciona um indicador visual de força de senha a qualquer campo de input. Ao receber foco ou a cada tecla digitada, exibe um popover com três barras coloridas e um título indicando o nível de força: fraca, média ou forte. Desaparece ao perder o foco.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Formulários de cadastro e alteração de senha onde o feedback de segurança é importante
|
|
10
|
+
- Qualquer campo de senha que precise orientar o usuário sobre a complexidade mínima exigida
|
|
11
|
+
|
|
12
|
+
## Quando não usar
|
|
13
|
+
|
|
14
|
+
- Para validação de senha no servidor — esta diretiva é apenas feedback visual no cliente
|
|
15
|
+
- Quando as regras de senha são exibidas de forma estática (lista de requisitos) — use texto informativo diretamente no formulário
|
|
16
|
+
- Em campos que não sejam de senha — use outros mecanismos de feedback
|
|
17
|
+
|
|
18
|
+
## Instalação
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import { PasswordStrengthModule } from '@seniorsistemas/angular-components/password-strength';
|
|
22
|
+
|
|
23
|
+
@NgModule({ imports: [PasswordStrengthModule] })
|
|
24
|
+
export class MeuModulo {}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Uso básico
|
|
28
|
+
|
|
29
|
+
```html
|
|
30
|
+
<input
|
|
31
|
+
type="password"
|
|
32
|
+
[sPasswordStrength]="true"
|
|
33
|
+
passwordStrengthDescription="A senha deve conter letras maiúsculas, números e caracteres especiais."
|
|
34
|
+
/>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## API
|
|
38
|
+
|
|
39
|
+
### Inputs (diretiva `sPasswordStrength`)
|
|
40
|
+
|
|
41
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
42
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
43
|
+
| `sPasswordStrength` | `boolean` | `true` | Não | Habilita ou desabilita o indicador de força |
|
|
44
|
+
| `passwordStrengthDescription` | `string` | — | Sim | Texto de orientação exibido no indicador |
|
|
45
|
+
| `passwordStrengthPosition` | `PasswordStrengthPositions` | `'right'` | Não | Posição preferencial do indicador em relação ao campo |
|
|
46
|
+
| `passwordStrengthWeakTitle` | `string` | Tradução padrão | Não | Texto customizado para o nível fraco |
|
|
47
|
+
| `passwordStrengthMediumTitle` | `string` | Tradução padrão | Não | Texto customizado para o nível médio |
|
|
48
|
+
| `passwordStrengthStrongTitle` | `string` | Tradução padrão | Não | Texto customizado para o nível forte |
|
|
49
|
+
| `passwordStrengthValidation` | `(content: string) => PasswordStrengths` | Validação padrão | Não | Função customizada para calcular a força da senha |
|
|
50
|
+
|
|
51
|
+
### Tipos
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
type PasswordStrengthPositions = 'top' | 'right' | 'left';
|
|
55
|
+
|
|
56
|
+
type PasswordStrengths = 'veryWeak' | 'weak' | 'medium' | 'strong';
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Validação padrão
|
|
60
|
+
|
|
61
|
+
A função padrão avalia os seguintes critérios (1 ponto cada):
|
|
62
|
+
|
|
63
|
+
- Comprimento mínimo de 6 caracteres
|
|
64
|
+
- Contém pelo menos um número
|
|
65
|
+
- Contém pelo menos uma letra minúscula
|
|
66
|
+
- Contém pelo menos uma letra maiúscula
|
|
67
|
+
- Contém pelo menos um caractere especial (`!@#$%&*.\\=+^~-`)
|
|
68
|
+
|
|
69
|
+
| Pontos | Nível |
|
|
70
|
+
|--------|-------|
|
|
71
|
+
| 0 | `veryWeak` |
|
|
72
|
+
| 1–3 | `weak` |
|
|
73
|
+
| 4 | `medium` |
|
|
74
|
+
| 5 | `strong` |
|
|
75
|
+
|
|
76
|
+
## Exemplos
|
|
77
|
+
|
|
78
|
+
### Campo padrão com validação padrão
|
|
79
|
+
|
|
80
|
+
```html
|
|
81
|
+
<div style="display: flex; flex-direction: column; gap: 8px;">
|
|
82
|
+
<label>Senha</label>
|
|
83
|
+
<input
|
|
84
|
+
type="password"
|
|
85
|
+
[sPasswordStrength]="true"
|
|
86
|
+
passwordStrengthDescription="A senha deve ter letras maiúsculas, números e caracteres especiais."
|
|
87
|
+
/>
|
|
88
|
+
</div>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Com validação customizada
|
|
92
|
+
|
|
93
|
+
```html
|
|
94
|
+
<input
|
|
95
|
+
type="password"
|
|
96
|
+
[sPasswordStrength]="true"
|
|
97
|
+
passwordStrengthDescription="A senha deve ter no mínimo 8 caracteres."
|
|
98
|
+
[passwordStrengthValidation]="meuValidador"
|
|
99
|
+
/>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
meuValidador(content: string): PasswordStrengths {
|
|
104
|
+
if (content.length < 4) return 'veryWeak';
|
|
105
|
+
if (content.length < 6) return 'weak';
|
|
106
|
+
if (content.length < 8) return 'medium';
|
|
107
|
+
return 'strong';
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Com títulos customizados
|
|
112
|
+
|
|
113
|
+
```html
|
|
114
|
+
<input
|
|
115
|
+
type="password"
|
|
116
|
+
[sPasswordStrength]="true"
|
|
117
|
+
passwordStrengthDescription="Use letras, números e símbolos."
|
|
118
|
+
passwordStrengthWeakTitle="Insegura"
|
|
119
|
+
passwordStrengthMediumTitle="Razoável"
|
|
120
|
+
passwordStrengthStrongTitle="Segura"
|
|
121
|
+
/>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Posicionado à esquerda
|
|
125
|
+
|
|
126
|
+
```html
|
|
127
|
+
<input
|
|
128
|
+
type="password"
|
|
129
|
+
[sPasswordStrength]="true"
|
|
130
|
+
passwordStrengthDescription="Requisitos da senha."
|
|
131
|
+
passwordStrengthPosition="left"
|
|
132
|
+
/>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Acessibilidade
|
|
136
|
+
|
|
137
|
+
- O indicador é exibido ao focar o campo (`focus`) e a cada tecla digitada (`keyup`)
|
|
138
|
+
- O indicador desaparece ao perder o foco (`blur`)
|
|
139
|
+
- O componente reposiciona automaticamente entre `right`, `left` e `top` conforme o espaço disponível na viewport
|
|
140
|
+
- O texto de `passwordStrengthDescription` orienta o usuário sobre os requisitos da senha
|
|
141
|
+
|
|
142
|
+
## Componentes relacionados
|
|
143
|
+
|
|
144
|
+
- [`PinCodeField`](../pin-code-field/README.md) — campo de código PIN com navegação entre dígitos
|