@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,127 @@
|
|
|
1
|
+
# StarRating
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Componente de avaliação por estrelas para coletar feedback de usuários. Permite selecionar uma nota em uma escala visual de estrelas, com suporte à integração com Reactive Forms e ngModel.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Avaliação de produtos em e-commerce
|
|
10
|
+
- Coleta de feedback de serviços ou atendimento
|
|
11
|
+
- Classificação de conteúdo (artigos, vídeos, cursos)
|
|
12
|
+
- Formulários de satisfação do usuário
|
|
13
|
+
|
|
14
|
+
## Quando não usar
|
|
15
|
+
|
|
16
|
+
- Escalas de avaliação com texto descritivo por nível — prefira `RadioButtonGroup` com labels
|
|
17
|
+
- Coleta de sentimento binário (positivo/negativo) — prefira um par de botões ou `Switch`
|
|
18
|
+
- Exibição de média de avaliações sem interação — considere usar ícones estáticos
|
|
19
|
+
|
|
20
|
+
## Instalação
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { StarRatingComponent } from '@seniorsistemas/angular-components/star-rating';
|
|
24
|
+
|
|
25
|
+
@Component({ standalone: true, imports: [StarRatingComponent] })
|
|
26
|
+
export class MeuComponent {}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Uso básico
|
|
30
|
+
|
|
31
|
+
```html
|
|
32
|
+
<s-star-rating formControlName="avaliacao" [starsRange]="5" />
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## API
|
|
36
|
+
|
|
37
|
+
### Inputs
|
|
38
|
+
|
|
39
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
40
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
41
|
+
| `selectedStar` | `ModelSignal<number>` | `0` | Não | Índice da estrela selecionada (1-based). Suporta `[(selectedStar)]` |
|
|
42
|
+
| `starsRange` | `InputSignal<number>` | `5` | Não | Número total de estrelas exibidas |
|
|
43
|
+
| `justifyContent` | `JustifyTypes` | `'center'` | Não | Alinhamento horizontal das estrelas |
|
|
44
|
+
| `disabled` | `ModelSignal<boolean>` | `false` | Não | Desabilita a seleção de estrelas. Suporta `[(disabled)]` |
|
|
45
|
+
|
|
46
|
+
### Tipos
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
type JustifyTypes =
|
|
50
|
+
| 'start' | 'end' | 'center'
|
|
51
|
+
| 'between' | 'around' | 'evenly'
|
|
52
|
+
| 'stretch' | 'baseline' | 'normal'
|
|
53
|
+
| 'end-safe' | 'center-safe';
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Exemplos
|
|
57
|
+
|
|
58
|
+
### Avaliação padrão com 5 estrelas
|
|
59
|
+
|
|
60
|
+
```html
|
|
61
|
+
<s-star-rating
|
|
62
|
+
[selectedStar]="3"
|
|
63
|
+
[starsRange]="5"
|
|
64
|
+
justifyContent="center"
|
|
65
|
+
></s-star-rating>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Integração com Reactive Forms
|
|
69
|
+
|
|
70
|
+
```html
|
|
71
|
+
<form [formGroup]="formGroup">
|
|
72
|
+
<s-star-rating
|
|
73
|
+
formControlName="avaliacao"
|
|
74
|
+
[starsRange]="5"
|
|
75
|
+
justifyContent="center"
|
|
76
|
+
></s-star-rating>
|
|
77
|
+
<p>Valor selecionado: {{ formGroup.get('avaliacao')?.value }} estrela(s)</p>
|
|
78
|
+
</form>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
formGroup = new FormGroup({
|
|
83
|
+
avaliacao: new FormControl(2),
|
|
84
|
+
});
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Escala customizada de 10 estrelas
|
|
88
|
+
|
|
89
|
+
```html
|
|
90
|
+
<s-star-rating
|
|
91
|
+
[(selectedStar)]="nota"
|
|
92
|
+
[starsRange]="10"
|
|
93
|
+
justifyContent="center"
|
|
94
|
+
></s-star-rating>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Somente leitura (desabilitado)
|
|
98
|
+
|
|
99
|
+
```html
|
|
100
|
+
<s-star-rating
|
|
101
|
+
[selectedStar]="mediaAvaliacoes"
|
|
102
|
+
[starsRange]="5"
|
|
103
|
+
[disabled]="true"
|
|
104
|
+
justifyContent="start"
|
|
105
|
+
></s-star-rating>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Alinhamento à esquerda em listagem
|
|
109
|
+
|
|
110
|
+
```html
|
|
111
|
+
<s-star-rating
|
|
112
|
+
[selectedStar]="produto.avaliacao"
|
|
113
|
+
[starsRange]="5"
|
|
114
|
+
justifyContent="start"
|
|
115
|
+
></s-star-rating>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Acessibilidade
|
|
119
|
+
|
|
120
|
+
- Cada estrela é renderizada com `role="radio"` dentro de um grupo de radiobuttons
|
|
121
|
+
- Navegação por teclado: `Tab` para focar o grupo, `ArrowLeft`/`ArrowRight` para navegar entre estrelas
|
|
122
|
+
- Clicar na estrela já selecionada a deseleciona (retorna o valor para `0`)
|
|
123
|
+
- O estado `disabled` bloqueia totalmente a interação e é propagado via `setDisabledState` do `ControlValueAccessor`
|
|
124
|
+
|
|
125
|
+
## Componentes relacionados
|
|
126
|
+
|
|
127
|
+
- [`RadioButtonGroup`](../radio-button-group/README.md) — seleção única com rótulos descritivos por opção
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# StatsCard
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Card de estatística que exibe um valor numérico com ícone, rótulo e animação de contagem. Suporta diferentes estilos visuais (modo claro, modo escuro, versão leve) e pode emitir evento ao ser clicado.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Dashboards com métricas e indicadores de performance
|
|
10
|
+
- Painéis de resumo com dados numéricos relevantes (totais, contagens, KPIs)
|
|
11
|
+
- Indicadores visuais que precisam destacar variações de valor com animação
|
|
12
|
+
|
|
13
|
+
## Quando não usar
|
|
14
|
+
|
|
15
|
+
- Exibição de dados textuais complexos — prefira `Card` ou um componente de lista
|
|
16
|
+
- Navegação para outra seção — prefira `Tile`
|
|
17
|
+
- Indicadores sem valor numérico central
|
|
18
|
+
|
|
19
|
+
## Instalação
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { StatsCardModule } from '@seniorsistemas/angular-components/stats-card';
|
|
23
|
+
|
|
24
|
+
@NgModule({ imports: [StatsCardModule] })
|
|
25
|
+
export class MeuModule {}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Uso básico
|
|
29
|
+
|
|
30
|
+
```html
|
|
31
|
+
<s-stats-card
|
|
32
|
+
label="Vendas"
|
|
33
|
+
value="1.234"
|
|
34
|
+
iconClass="fas fa-shopping-cart"
|
|
35
|
+
color="#3399ff"
|
|
36
|
+
/>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## API
|
|
40
|
+
|
|
41
|
+
### Inputs
|
|
42
|
+
|
|
43
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
44
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
45
|
+
| `label` | `string` | — | Sim | Rótulo descritivo da estatística exibida |
|
|
46
|
+
| `value` | `string` | `'0'` | Não | Valor numérico exibido. Quando `animateNumbers` está ativo, a contagem é animada |
|
|
47
|
+
| `iconClass` | `string` | `'fa fa-bar-chart'` | Não | Classe CSS do ícone (Font Awesome) |
|
|
48
|
+
| `color` | `string` | `'#339966'` | Não | Cor de destaque do card em formato CSS |
|
|
49
|
+
| `lightMode` | `boolean` | `true` | Não | Ativa o modo de cores claras (ícone com fundo colorido) |
|
|
50
|
+
| `lightVersion` | `boolean` | `false` | Não | Ativa a versão visual leve (sem sombra e com fundo claro) |
|
|
51
|
+
| `alwaysWithBorder` | `boolean` | `false` | Não | Exibe borda mesmo quando o card não está em destaque |
|
|
52
|
+
| `animateNumbers` | `boolean` | `true` | Não | Habilita a animação de contagem ao atualizar o valor |
|
|
53
|
+
| `clickable` | `boolean` | `false` | Não | Habilita o cursor de ponteiro e o evento de clique |
|
|
54
|
+
| `tooltip` | `string` | `''` | Não | Texto do tooltip exibido ao passar o mouse sobre o card |
|
|
55
|
+
| `id` | `string` | `'s-stats-card-{n}'` | Não | Identificador único do card no DOM |
|
|
56
|
+
|
|
57
|
+
### Outputs
|
|
58
|
+
|
|
59
|
+
| Evento | Tipo | Descrição |
|
|
60
|
+
|--------|------|-----------|
|
|
61
|
+
| `clicked` | `EventEmitter<MouseEvent>` | Emitido quando o usuário clica no card (requer `clickable = true`) |
|
|
62
|
+
|
|
63
|
+
## Exemplos
|
|
64
|
+
|
|
65
|
+
### Card padrão (modo claro)
|
|
66
|
+
|
|
67
|
+
```html
|
|
68
|
+
<s-stats-card
|
|
69
|
+
label="População"
|
|
70
|
+
value="214000000"
|
|
71
|
+
iconClass="fa fa-users"
|
|
72
|
+
color="#339966"
|
|
73
|
+
[lightMode]="true"
|
|
74
|
+
></s-stats-card>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Card modo escuro
|
|
78
|
+
|
|
79
|
+
```html
|
|
80
|
+
<s-stats-card
|
|
81
|
+
label="Área territorial"
|
|
82
|
+
value="8515767 km²"
|
|
83
|
+
iconClass="fa fa-map"
|
|
84
|
+
color="#F45B5B"
|
|
85
|
+
[lightMode]="false"
|
|
86
|
+
></s-stats-card>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Card clicável
|
|
90
|
+
|
|
91
|
+
```html
|
|
92
|
+
<s-stats-card
|
|
93
|
+
label="Estados"
|
|
94
|
+
value="27"
|
|
95
|
+
iconClass="fa fa-flag"
|
|
96
|
+
color="#4A90E2"
|
|
97
|
+
[clickable]="true"
|
|
98
|
+
[alwaysWithBorder]="true"
|
|
99
|
+
tooltip="Clique para ver detalhes"
|
|
100
|
+
(clicked)="onVerDetalhes($event)"
|
|
101
|
+
></s-stats-card>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Grid de múltiplos cards
|
|
105
|
+
|
|
106
|
+
```html
|
|
107
|
+
<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 1rem;">
|
|
108
|
+
<s-stats-card label="Total de pedidos" value="1.234" iconClass="fa fa-shopping-cart" color="#339966" [lightMode]="true"></s-stats-card>
|
|
109
|
+
<s-stats-card label="Receita" value="R$ 45.200" iconClass="fa fa-dollar" color="#4A90E2" [lightMode]="false"></s-stats-card>
|
|
110
|
+
<s-stats-card label="Usuários ativos" value="892" iconClass="fa fa-users" color="#9B59B6" [lightMode]="true" [lightVersion]="true"></s-stats-card>
|
|
111
|
+
</div>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Com valor dinâmico e animação
|
|
115
|
+
|
|
116
|
+
```html
|
|
117
|
+
<s-stats-card
|
|
118
|
+
label="Visitantes hoje"
|
|
119
|
+
[value]="visitantesHoje.toString()"
|
|
120
|
+
iconClass="fa fa-eye"
|
|
121
|
+
color="#339966"
|
|
122
|
+
[animateNumbers]="true"
|
|
123
|
+
></s-stats-card>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Acessibilidade
|
|
127
|
+
|
|
128
|
+
- Quando `clickable = true`, o card recebe cursor pointer; recomenda-se fornecer `tooltip` descritivo para leitores de tela
|
|
129
|
+
- A animação de contagem tem duração de 200ms com steps de 20ms; não é disparada quando `animateNumbers = false`
|
|
130
|
+
- O atributo `id` permite associar o card a outros elementos acessíveis na página
|
|
131
|
+
|
|
132
|
+
## Componentes relacionados
|
|
133
|
+
|
|
134
|
+
- [`Tile`](../tile/README.md) — card clicável para navegação
|
|
135
|
+
- [`Card`](../card/README.md) — container genérico de conteúdo
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Stepper
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Componente de progresso em etapas que exibe uma linha do tempo horizontal de passos com animações. Permite ao usuário visualizar e navegar entre etapas de um fluxo sequencial. Suporta passos ocultos, desabilitados e diferentes estados visuais (sucesso, aviso).
|
|
6
|
+
|
|
7
|
+
> **Nota:** O seletor `s-steps` e o pacote `steps` estão descontinuados. Use `s-stepper` e o pacote `stepper` em novos projetos. O seletor antigo será removido na versão 20.0.0.
|
|
8
|
+
|
|
9
|
+
## Quando usar
|
|
10
|
+
|
|
11
|
+
- Formulários multi-etapa (wizard) com progresso visível
|
|
12
|
+
- Onboarding de novos usuários com passos sequenciais
|
|
13
|
+
- Processos de checkout ou cadastro com etapas bem definidas
|
|
14
|
+
- Fluxos onde o usuário pode navegar de volta para corrigir etapas anteriores
|
|
15
|
+
|
|
16
|
+
## Quando não usar
|
|
17
|
+
|
|
18
|
+
- Fluxos com apenas 2 passos — prefira botões Anterior/Próximo simples
|
|
19
|
+
- Navegação geral da aplicação — prefira tabs ou breadcrumbs
|
|
20
|
+
- Processos sem sequência clara entre etapas
|
|
21
|
+
|
|
22
|
+
## Instalação
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import { StepperModule } from '@seniorsistemas/angular-components/stepper';
|
|
26
|
+
|
|
27
|
+
@NgModule({ imports: [StepperModule] })
|
|
28
|
+
export class MeuModule {}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Uso básico
|
|
32
|
+
|
|
33
|
+
```html
|
|
34
|
+
<s-stepper
|
|
35
|
+
[steps]="etapas"
|
|
36
|
+
[activeIndex]="etapaAtiva"
|
|
37
|
+
(stepSelected)="onEtapaSelecionada($event)"
|
|
38
|
+
/>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## API
|
|
42
|
+
|
|
43
|
+
### Inputs
|
|
44
|
+
|
|
45
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
46
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
47
|
+
| `steps` | `Step[]` | — | Sim | Lista de etapas exibidas no stepper |
|
|
48
|
+
| `activeIndex` | `number` | `0` | Sim | Índice (0-based) da etapa atualmente ativa. Controlado externamente |
|
|
49
|
+
| `id` | `string` | `'s-steps-{n}'` | Não | Identificador único do componente no DOM |
|
|
50
|
+
|
|
51
|
+
### Outputs
|
|
52
|
+
|
|
53
|
+
| Evento | Tipo | Descrição |
|
|
54
|
+
|--------|------|-----------|
|
|
55
|
+
| `stepSelected` | `EventEmitter<StepSelectionEvent>` | Emitido quando o usuário clica em uma etapa habilitada e não ativa |
|
|
56
|
+
|
|
57
|
+
### Tipos
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
interface Step {
|
|
61
|
+
id: any;
|
|
62
|
+
label: string; // Texto exibido abaixo do indicador. Obrigatório.
|
|
63
|
+
state?: StepState; // Estado visual do passo
|
|
64
|
+
disabled?: boolean; // Impede clique e aplica estilo desabilitado
|
|
65
|
+
hidden?: boolean; // Remove o passo da renderização
|
|
66
|
+
tooltip?: string; // Texto do tooltip ao passar o mouse
|
|
67
|
+
ariaLabel?: string; // Label acessível alternativo
|
|
68
|
+
ariaControls?: string; // ID do painel controlado por este passo
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
enum StepState {
|
|
72
|
+
Default = 'default',
|
|
73
|
+
Success = 'success',
|
|
74
|
+
Warning = 'warning',
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
interface StepSelectionEvent {
|
|
78
|
+
step: Step; // Objeto Step selecionado
|
|
79
|
+
index: number; // Índice da etapa selecionada
|
|
80
|
+
event: Event; // Evento de clique original
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Exemplos
|
|
85
|
+
|
|
86
|
+
### Fluxo básico com 4 etapas
|
|
87
|
+
|
|
88
|
+
```html
|
|
89
|
+
<s-stepper
|
|
90
|
+
[steps]="etapas"
|
|
91
|
+
[activeIndex]="etapaAtual"
|
|
92
|
+
(stepSelected)="onSelecionar($event)"
|
|
93
|
+
></s-stepper>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
etapas: Step[] = [
|
|
98
|
+
{ id: '1', label: 'Dados Pessoais' },
|
|
99
|
+
{ id: '2', label: 'Endereço' },
|
|
100
|
+
{ id: '3', label: 'Contato' },
|
|
101
|
+
{ id: '4', label: 'Confirmação' },
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
onSelecionar(event: StepSelectionEvent): void {
|
|
105
|
+
this.etapaAtual = event.index;
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Com estados visuais
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
etapas: Step[] = [
|
|
113
|
+
{ id: '1', label: 'Dados Pessoais', state: StepState.Success },
|
|
114
|
+
{ id: '2', label: 'Endereço', state: StepState.Warning },
|
|
115
|
+
{ id: '3', label: 'Documentos', state: StepState.Success },
|
|
116
|
+
{ id: '4', label: 'Confirmação' },
|
|
117
|
+
];
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Modo linear (passos futuros bloqueados)
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
etapas: Step[] = [
|
|
124
|
+
{ id: '1', label: 'Concluído', state: StepState.Success },
|
|
125
|
+
{ id: '2', label: 'Em Andamento' },
|
|
126
|
+
{ id: '3', label: 'Bloqueado', disabled: true },
|
|
127
|
+
{ id: '4', label: 'Bloqueado', disabled: true },
|
|
128
|
+
];
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Com tooltips explicativos
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
etapas: Step[] = [
|
|
135
|
+
{ id: '1', label: 'Cadastro', state: StepState.Success, tooltip: 'Etapa concluída' },
|
|
136
|
+
{ id: '2', label: 'Validação', tooltip: 'Valide seu e-mail e telefone' },
|
|
137
|
+
{ id: '3', label: 'Aprovação', disabled: true, tooltip: 'Aguardando validação' },
|
|
138
|
+
];
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Com botões de navegação
|
|
142
|
+
|
|
143
|
+
```html
|
|
144
|
+
<s-stepper [steps]="etapas" [activeIndex]="etapaAtual" (stepSelected)="onSelecionar($event)"></s-stepper>
|
|
145
|
+
|
|
146
|
+
<div style="display: flex; gap: 8px; margin-top: 16px; justify-content: flex-end;">
|
|
147
|
+
<button [disabled]="etapaAtual === 0" (click)="voltar()">Voltar</button>
|
|
148
|
+
<button [disabled]="etapaAtual === etapas.length - 1" (click)="avancar()">Avançar</button>
|
|
149
|
+
</div>
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Acessibilidade
|
|
153
|
+
|
|
154
|
+
- O componente possui `role="tablist"` e `aria-orientation="horizontal"`
|
|
155
|
+
- Cada passo é renderizado com `role="tab"` e `aria-selected`
|
|
156
|
+
- O atributo `ariaLabel` permite fornecer um nome alternativo mais descritivo para leitores de tela
|
|
157
|
+
- O atributo `ariaControls` vincula o passo ao painel de conteúdo correspondente
|
|
158
|
+
- Passos visitados (índice menor que `activeIndex`) recebem ícone de check automaticamente
|
|
159
|
+
- A barra de progresso entre os passos é animada ao mudar o `activeIndex`
|
|
160
|
+
|
|
161
|
+
## Componentes relacionados
|
|
162
|
+
|
|
163
|
+
- [`Steps`](../steps/README.md) — alias depreciado para este componente
|
|
164
|
+
- [`Accordion`](../accordion/README.md) — organização de conteúdo em seções expansíveis
|
package/switch/README.md
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Switch
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Componente de chave tipo switch (liga/desliga) para alternar entre dois estados booleanos. Implementa `ControlValueAccessor` para uso em formulários Angular. Suporta rótulos personalizados para os estados verdadeiro e falso, além de modo somente leitura.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Ativar ou desativar funcionalidades ou configurações
|
|
10
|
+
- Preferências do usuário (notificações, atualizações automáticas)
|
|
11
|
+
- Qualquer contexto com decisão binária clara (ligado/desligado, ativo/inativo)
|
|
12
|
+
|
|
13
|
+
## Quando não usar
|
|
14
|
+
|
|
15
|
+
- Seleção de múltiplas opções — prefira `Checkbox`
|
|
16
|
+
- Escolha entre mais de dois estados — prefira `RadioButtonGroup` ou `SelectButton`
|
|
17
|
+
- Quando o estado precisa de confirmação antes de ser aplicado — prefira `Checkbox` com botão de submissão
|
|
18
|
+
|
|
19
|
+
## Instalação
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { SwitchModule } from '@seniorsistemas/angular-components/switch';
|
|
23
|
+
|
|
24
|
+
@NgModule({ imports: [SwitchModule] })
|
|
25
|
+
export class MeuModule {}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Uso básico
|
|
29
|
+
|
|
30
|
+
```html
|
|
31
|
+
<s-switch formControlName="ativo" trueLabel="Ativo" falseLabel="Inativo" />
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## API
|
|
35
|
+
|
|
36
|
+
### Inputs
|
|
37
|
+
|
|
38
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
39
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
40
|
+
| `value` | `boolean` | `false` | Não | Estado atual do switch |
|
|
41
|
+
| `trueLabel` | `string` | `'Ligado'` | Não | Rótulo exibido quando o valor é `true` |
|
|
42
|
+
| `falseLabel` | `string` | `'Desligado'` | Não | Rótulo exibido quando o valor é `false` |
|
|
43
|
+
| `disabled` | `boolean` | `false` | Não | Desabilita o componente, impedindo interação e alterações |
|
|
44
|
+
| `readonly` | `boolean` | `false` | Não | Impede alterações pelo usuário sem desabilitar visualmente o campo |
|
|
45
|
+
| `showStatusLabel` | `boolean` | `true` | Não | Controla se o label de status (trueLabel/falseLabel) é exibido |
|
|
46
|
+
| `inputId` | `string` | `undefined` | Não | ID do `<input>` interno para associação com `<label>` externo |
|
|
47
|
+
| `inputName` | `string` | `undefined` | Não | Atributo `name` do `<input>` interno |
|
|
48
|
+
| `label` | `string` | `undefined` | Não | Nome acessível descritivo para tecnologias assistivas (`aria-label`) |
|
|
49
|
+
|
|
50
|
+
### Outputs
|
|
51
|
+
|
|
52
|
+
| Evento | Tipo | Descrição |
|
|
53
|
+
|--------|------|-----------|
|
|
54
|
+
| `valueChanged` | `EventEmitter<boolean>` | Emitido quando o valor do switch muda, com o novo estado booleano |
|
|
55
|
+
|
|
56
|
+
## Exemplos
|
|
57
|
+
|
|
58
|
+
### Switch básico sem labels
|
|
59
|
+
|
|
60
|
+
```html
|
|
61
|
+
<s-switch formControlName="ativo"></s-switch>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Com labels customizados
|
|
65
|
+
|
|
66
|
+
```html
|
|
67
|
+
<s-switch
|
|
68
|
+
formControlName="notificacoes"
|
|
69
|
+
trueLabel="Notificações ativadas"
|
|
70
|
+
falseLabel="Notificações desativadas"
|
|
71
|
+
></s-switch>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Integração com Reactive Forms
|
|
75
|
+
|
|
76
|
+
```html
|
|
77
|
+
<form [formGroup]="form" (ngSubmit)="salvar()">
|
|
78
|
+
<s-switch
|
|
79
|
+
formControlName="notificacoes"
|
|
80
|
+
trueLabel="Notificações Ativadas"
|
|
81
|
+
falseLabel="Notificações Desativadas"
|
|
82
|
+
></s-switch>
|
|
83
|
+
<s-switch
|
|
84
|
+
formControlName="marketing"
|
|
85
|
+
trueLabel="Aceito receber ofertas"
|
|
86
|
+
falseLabel="Não aceito ofertas"
|
|
87
|
+
></s-switch>
|
|
88
|
+
<s-switch
|
|
89
|
+
formControlName="atualizacoes"
|
|
90
|
+
trueLabel="Atualizações automáticas"
|
|
91
|
+
falseLabel="Atualizações manuais"
|
|
92
|
+
></s-switch>
|
|
93
|
+
<button type="submit">Salvar Preferências</button>
|
|
94
|
+
</form>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Somente leitura (readonly)
|
|
98
|
+
|
|
99
|
+
```html
|
|
100
|
+
<!-- Mantém aparência habilitada, mas bloqueia alterações -->
|
|
101
|
+
<s-switch [value]="true" trueLabel="Ativo" falseLabel="Inativo" [readonly]="true"></s-switch>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Desabilitado
|
|
105
|
+
|
|
106
|
+
```html
|
|
107
|
+
<s-switch
|
|
108
|
+
trueLabel="Habilitado"
|
|
109
|
+
falseLabel="Desabilitado"
|
|
110
|
+
[disabled]="true"
|
|
111
|
+
></s-switch>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Acessibilidade
|
|
115
|
+
|
|
116
|
+
- O elemento interno é um `<input type="checkbox">` com `role="switch"`, garantindo semântica correta para leitores de tela
|
|
117
|
+
- Pode ser ativado/desativado com `Espaço` quando em foco
|
|
118
|
+
- O input recebe foco visual ao ser navegado por teclado (classe CSS `switch--focus` adicionada via `focusin`/`focusout`)
|
|
119
|
+
- O `inputId` permite associar um `<label>` externo para melhor acessibilidade
|
|
120
|
+
- O `label` define um `aria-label` descritivo quando não há label visual associado
|
|
121
|
+
|
|
122
|
+
## Componentes relacionados
|
|
123
|
+
|
|
124
|
+
- [`Checkbox`](../checkbox/README.md) — seleção de múltiplas opções independentes
|
|
125
|
+
- [`RadioButton`](../radio-button/README.md) — seleção única entre opções mutuamente exclusivas
|