@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,144 @@
|
|
|
1
|
+
# Breadcrumb
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Componente de trilha de navegação que constrói automaticamente o caminho hierárquico de páginas a partir das rotas do Angular Router. Exibe o título da rota atual e os itens de navegação como links clicáveis.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Indicar ao usuário a posição atual dentro de uma hierarquia de navegação
|
|
10
|
+
- Permitir que o usuário navegue rapidamente para níveis anteriores da hierarquia
|
|
11
|
+
- Em aplicações com rotas aninhadas de 2 ou mais níveis
|
|
12
|
+
|
|
13
|
+
## Quando não usar
|
|
14
|
+
|
|
15
|
+
- Em páginas de primeiro nível sem hierarquia — o breadcrumb teria apenas o item home, sem valor de navegação
|
|
16
|
+
- Quando a navegação é linear (wizard/steps) — use um componente de passos em vez de breadcrumb
|
|
17
|
+
|
|
18
|
+
## Instalação
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import { BreadcrumbModule } from '@seniorsistemas/angular-components/breadcrumb';
|
|
22
|
+
|
|
23
|
+
@NgModule({
|
|
24
|
+
imports: [BreadcrumbModule],
|
|
25
|
+
})
|
|
26
|
+
export class MeuModule {}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Uso básico
|
|
30
|
+
|
|
31
|
+
```html
|
|
32
|
+
<s-breadcrumb></s-breadcrumb>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Configuração de rotas
|
|
36
|
+
|
|
37
|
+
O breadcrumb lê automaticamente o campo `data.routeTitle` de cada rota. Toda rota com `path` e `component` **deve** ter `routeTitle` definido, caso contrário um erro é lançado.
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
const routes: Routes = [
|
|
41
|
+
{
|
|
42
|
+
path: 'dashboard',
|
|
43
|
+
component: DashboardComponent,
|
|
44
|
+
data: { routeTitle: 'Dashboard' },
|
|
45
|
+
children: [
|
|
46
|
+
{
|
|
47
|
+
path: 'relatorios',
|
|
48
|
+
component: RelatoriosComponent,
|
|
49
|
+
data: { routeTitle: 'Relatórios' },
|
|
50
|
+
children: [
|
|
51
|
+
{
|
|
52
|
+
path: 'vendas',
|
|
53
|
+
component: VendasComponent,
|
|
54
|
+
data: { routeTitle: 'Vendas' },
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## API
|
|
64
|
+
|
|
65
|
+
### Inputs
|
|
66
|
+
|
|
67
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
68
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
69
|
+
| `homeUrl` | `string` | `undefined` | não | URL externa para o ícone home (quando definida, usa `<a>` externo em vez do router) |
|
|
70
|
+
| `targetHomeUrl` | `'_self' \| '_blank' \| '_parent' \| '_top'` | `'_self'` | não | Atributo `target` do link home quando `homeUrl` está definido |
|
|
71
|
+
|
|
72
|
+
### Tipos
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
type BreadcrumbItem = {
|
|
76
|
+
routerLink?: string | string[];
|
|
77
|
+
active?: boolean;
|
|
78
|
+
disabled?: boolean;
|
|
79
|
+
disabledIcon?: boolean;
|
|
80
|
+
hideLabel?: boolean;
|
|
81
|
+
queryParams?: Params;
|
|
82
|
+
url?: string;
|
|
83
|
+
icon?: string;
|
|
84
|
+
target?: string;
|
|
85
|
+
label?: string;
|
|
86
|
+
};
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Exemplos
|
|
90
|
+
|
|
91
|
+
### Dois níveis (home + página atual)
|
|
92
|
+
|
|
93
|
+
```html
|
|
94
|
+
<!-- Configuração de rota -->
|
|
95
|
+
<!-- { path: 'dashboard', component: DashboardComponent, data: { routeTitle: 'Dashboard' } } -->
|
|
96
|
+
|
|
97
|
+
<s-breadcrumb></s-breadcrumb>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Com URL de home externa (portal)
|
|
101
|
+
|
|
102
|
+
```html
|
|
103
|
+
<s-breadcrumb homeUrl="https://portal.empresa.com" targetHomeUrl="_blank"></s-breadcrumb>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Quatro níveis de navegação
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
// Configuração das rotas
|
|
110
|
+
const routes: Routes = [
|
|
111
|
+
{
|
|
112
|
+
path: 'modulo',
|
|
113
|
+
data: { routeTitle: 'Módulo' },
|
|
114
|
+
children: [
|
|
115
|
+
{
|
|
116
|
+
path: 'secao',
|
|
117
|
+
data: { routeTitle: 'Seção' },
|
|
118
|
+
children: [
|
|
119
|
+
{
|
|
120
|
+
path: 'pagina',
|
|
121
|
+
component: PaginaComponent,
|
|
122
|
+
data: { routeTitle: 'Página' },
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
```html
|
|
132
|
+
<s-breadcrumb></s-breadcrumb>
|
|
133
|
+
<!-- Resultado: Home > Módulo > Seção > Página (atual, não clicável) -->
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Acessibilidade
|
|
137
|
+
|
|
138
|
+
- O breadcrumb é renderizado como `<nav>` com `aria-label` adequado
|
|
139
|
+
- O item da rota atual é exibido como desabilitado (não clicável), refletindo a posição atual
|
|
140
|
+
- O ícone home é acessível via teclado
|
|
141
|
+
|
|
142
|
+
## Componentes relacionados
|
|
143
|
+
|
|
144
|
+
- [`Topbar`](../topbar/README.md) — barra superior de navegação onde o breadcrumb costuma ser posicionado
|
package/button/README.md
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# Button
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Componente de botão versátil para ações do usuário, com suporte a ícones, tooltip, menu dropdown (tiered menu), badge, animações e diferentes prioridades visuais.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Acionar ações do usuário: salvar, cancelar, excluir, navegar
|
|
10
|
+
- Agrupar múltiplas ações relacionadas em um menu dropdown
|
|
11
|
+
- Botões de refresh com animação de rotação no ícone
|
|
12
|
+
- Toolbars com botões de ícone e tooltip
|
|
13
|
+
|
|
14
|
+
## Quando não usar
|
|
15
|
+
|
|
16
|
+
- Para navegação entre páginas — use `routerLink` em um elemento `<a>` para preservar semântica HTML
|
|
17
|
+
- Para formulários com múltiplos campos de ação — avalie se um `<button type="submit">` nativo não atende melhor
|
|
18
|
+
- Para exibir ícones puramente decorativos — use a tag de ícone diretamente
|
|
19
|
+
|
|
20
|
+
## Instalação
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { ButtonComponent } from '@seniorsistemas/angular-components/button';
|
|
24
|
+
|
|
25
|
+
@Component({ standalone: true, imports: [ButtonComponent] })
|
|
26
|
+
export class MeuComponent {}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Uso básico
|
|
30
|
+
|
|
31
|
+
```html
|
|
32
|
+
<s-button label="Salvar" priority="primary" (clicked)="salvar()" />
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## API
|
|
36
|
+
|
|
37
|
+
### Inputs
|
|
38
|
+
|
|
39
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
40
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
41
|
+
| `label` | `string` | `undefined` | não | Texto exibido dentro do botão |
|
|
42
|
+
| `priority` | `ButtonPriority` | `'primary'` | não | Prioridade visual: `'primary'`, `'secondary'`, `'danger'`, `'default'`, `'link'` |
|
|
43
|
+
| `iconClass` | `string` | `undefined` | não | Classe do ícone à esquerda do label (ex.: `'fa fa-save'`) |
|
|
44
|
+
| `rightIconClass` | `string` | `undefined` | não | Classe do ícone à direita do label |
|
|
45
|
+
| `disabled` | `boolean` | `false` | não | Desabilita o botão |
|
|
46
|
+
| `size` | `'default' \| 'small'` | `'default'` | não | Tamanho do botão |
|
|
47
|
+
| `tooltip` | `string` | `undefined` | não | Texto do tooltip ao passar o mouse |
|
|
48
|
+
| `tooltipPosition` | `TooltipPositions` | `'top'` | não | Posição do tooltip |
|
|
49
|
+
| `menuOptions` | `TieredMenuItemData[]` | `[]` | não | Itens do menu dropdown |
|
|
50
|
+
| `caret` | `boolean` | `true` | não | Exibe seta quando há menu dropdown |
|
|
51
|
+
| `animation` | `ButtonAnimations` | `undefined` | não | Animação no ícone (`'rotate'`) |
|
|
52
|
+
| `slide` | `boolean` | `false` | não | Expande o label ao passar o mouse (requer `priority: 'default'` ou `'link'`) |
|
|
53
|
+
| `auxiliary` | `boolean` | `false` | não | Bordas completamente arredondadas (estilo pill) |
|
|
54
|
+
| `badge` | `ButtonBadgeConfig` | `undefined` | não | Badge de notificação exibido sobre o botão |
|
|
55
|
+
| `iconColor` | `string` | `undefined` | não | Cor personalizada para o ícone |
|
|
56
|
+
| `styleClass` | `string` | `''` | não | Classes CSS adicionais |
|
|
57
|
+
| `type` | `'button' \| 'submit' \| 'reset'` | `'button'` | não | Tipo do elemento `<button>` HTML |
|
|
58
|
+
| `id` | `string` | `s-button-{hash}` | não | ID do elemento no DOM |
|
|
59
|
+
| `baseZIndex` | `number` | `0` | não | Z-index base do menu dropdown |
|
|
60
|
+
| `menuAriaLabel` | `string` | `undefined` | não | Rótulo ARIA do menu associado |
|
|
61
|
+
|
|
62
|
+
### Outputs
|
|
63
|
+
|
|
64
|
+
| Evento | Tipo | Descrição |
|
|
65
|
+
|--------|------|-----------|
|
|
66
|
+
| `clicked` | `EventEmitter<any>` | Emitido ao clicar no botão (quando não desabilitado) |
|
|
67
|
+
|
|
68
|
+
### Tipos
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
type ButtonPriority = 'default' | 'primary' | 'secondary' | 'link' | 'danger';
|
|
72
|
+
|
|
73
|
+
type ButtonAnimations = 'rotate';
|
|
74
|
+
|
|
75
|
+
interface ButtonBadgeConfig {
|
|
76
|
+
text?: string;
|
|
77
|
+
iconClass?: string;
|
|
78
|
+
color: BadgeColors; // 'red' | 'orange' | 'yellow' | 'blue' | 'green' | 'gray'
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Exemplos
|
|
83
|
+
|
|
84
|
+
### Prioridades disponíveis
|
|
85
|
+
|
|
86
|
+
```html
|
|
87
|
+
<s-button label="Primário" priority="primary"></s-button>
|
|
88
|
+
<s-button label="Secundário" priority="secondary"></s-button>
|
|
89
|
+
<s-button label="Padrão" priority="default"></s-button>
|
|
90
|
+
<s-button label="Perigo" priority="danger" iconClass="fa fa-trash"></s-button>
|
|
91
|
+
<s-button label="Link" priority="link"></s-button>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Com ícone e tooltip
|
|
95
|
+
|
|
96
|
+
```html
|
|
97
|
+
<!-- Botão apenas com ícone — use sempre tooltip para acessibilidade -->
|
|
98
|
+
<s-button iconClass="fa fa-trash" priority="secondary" tooltip="Excluir item"></s-button>
|
|
99
|
+
|
|
100
|
+
<!-- Botão com ícone à esquerda -->
|
|
101
|
+
<s-button label="Salvar" iconClass="fa fa-save" priority="primary"></s-button>
|
|
102
|
+
|
|
103
|
+
<!-- Botão com ícone à direita -->
|
|
104
|
+
<s-button label="Avançar" rightIconClass="fa fa-arrow-right" priority="primary"></s-button>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Com menu dropdown
|
|
108
|
+
|
|
109
|
+
```html
|
|
110
|
+
<s-button
|
|
111
|
+
label="Ações"
|
|
112
|
+
iconClass="fa fa-ellipsis-v"
|
|
113
|
+
priority="secondary"
|
|
114
|
+
[menuOptions]="opcoes">
|
|
115
|
+
</s-button>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
opcoes = [
|
|
120
|
+
{ label: 'Editar', iconClass: 'fa fa-edit', command: () => this.editar() },
|
|
121
|
+
{ label: 'Excluir', iconClass: 'fa fa-trash', command: () => this.excluir() },
|
|
122
|
+
{ divider: true },
|
|
123
|
+
{ label: 'Configurações', iconClass: 'fa fa-cog', command: () => this.configurar() },
|
|
124
|
+
];
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Com badge de notificação
|
|
128
|
+
|
|
129
|
+
```html
|
|
130
|
+
<s-button
|
|
131
|
+
label="Notificações"
|
|
132
|
+
iconClass="fa fa-bell"
|
|
133
|
+
priority="secondary"
|
|
134
|
+
[badge]="{ text: '5', color: 'red' }">
|
|
135
|
+
</s-button>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Com animação de rotação (refresh)
|
|
139
|
+
|
|
140
|
+
```html
|
|
141
|
+
<s-button
|
|
142
|
+
label="Recarregar"
|
|
143
|
+
iconClass="fa fa-sync"
|
|
144
|
+
animation="rotate"
|
|
145
|
+
priority="primary"
|
|
146
|
+
(clicked)="recarregar()">
|
|
147
|
+
</s-button>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Acessibilidade
|
|
151
|
+
|
|
152
|
+
- O componente renderiza um elemento `<button>` nativo, totalmente acessível via teclado
|
|
153
|
+
- Use **Tab** para focar e **Enter** ou **Space** para acionar
|
|
154
|
+
- Botões com apenas ícone devem sempre ter `tooltip` definido para comunicar a ação a leitores de tela
|
|
155
|
+
- O `menuAriaLabel` descreve o menu associado para tecnologias assistivas
|
|
156
|
+
|
|
157
|
+
## Componentes relacionados
|
|
158
|
+
|
|
159
|
+
- [`Badge`](../badge/README.md) — rótulos visuais; usado internamente pelo badge do botão
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# CalendarMask
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Diretiva que aplica máscara de entrada ao componente `p-calendar` do PrimeNG, formatando automaticamente a data conforme o `dateFormat` configurado no calendário.
|
|
6
|
+
|
|
7
|
+
> **Nota:** Esta diretiva foi desenvolvida originalmente para PrimeNG v9. Em versões mais recentes (v18+), podem ocorrer incompatibilidades no ambiente Storybook, porém o uso em aplicações Angular reais continua funcionando normalmente.
|
|
8
|
+
|
|
9
|
+
## Quando usar
|
|
10
|
+
|
|
11
|
+
- Campos de data onde o usuário precisa digitar a data manualmente (em vez de selecionar no calendário)
|
|
12
|
+
- Formulários com `p-calendar` que exigem entrada por teclado formatada
|
|
13
|
+
- Quando é necessário suporte a máscaras em intervalos de datas (`selectionMode="range"`)
|
|
14
|
+
|
|
15
|
+
## Quando não usar
|
|
16
|
+
|
|
17
|
+
- Quando o usuário sempre selecionará a data pelo calendário gráfico — a máscara não é necessária
|
|
18
|
+
- Em novos campos de data com formatos muito diferentes de `dd/mm/yy` — teste a compatibilidade antes
|
|
19
|
+
- Com `p-calendar` em modo `inline` — a máscara destina-se ao input de texto
|
|
20
|
+
|
|
21
|
+
## Instalação
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { CalendarMaskModule } from '@seniorsistemas/angular-components/calendar-mask';
|
|
25
|
+
|
|
26
|
+
@NgModule({
|
|
27
|
+
imports: [CalendarMaskModule],
|
|
28
|
+
})
|
|
29
|
+
export class MeuModule {}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Uso básico
|
|
33
|
+
|
|
34
|
+
Adicione o atributo `sCalendarMask` diretamente ao `p-calendar`:
|
|
35
|
+
|
|
36
|
+
```html
|
|
37
|
+
<p-calendar sCalendarMask [(ngModel)]="data" dateFormat="dd/mm/yy" />
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## API
|
|
41
|
+
|
|
42
|
+
### Inputs
|
|
43
|
+
|
|
44
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
45
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
46
|
+
| `slotChar` | `string` | `'_'` | não | Caractere placeholder para posições não preenchidas na máscara |
|
|
47
|
+
| `autoClear` | `boolean` | `false` | não | Limpa o campo ao perder o foco se o valor for inválido |
|
|
48
|
+
|
|
49
|
+
## Exemplos
|
|
50
|
+
|
|
51
|
+
### Data simples
|
|
52
|
+
|
|
53
|
+
```html
|
|
54
|
+
<p-calendar sCalendarMask [(ngModel)]="data" dateFormat="dd/mm/yy" />
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Data e hora
|
|
58
|
+
|
|
59
|
+
```html
|
|
60
|
+
<p-calendar sCalendarMask [(ngModel)]="data" dateFormat="dd/mm/yy" [showTime]="true" />
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Data, hora e segundos
|
|
64
|
+
|
|
65
|
+
```html
|
|
66
|
+
<p-calendar sCalendarMask [(ngModel)]="data" dateFormat="dd/mm/yy" [showTime]="true" [showSeconds]="true" />
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Intervalo de datas
|
|
70
|
+
|
|
71
|
+
```html
|
|
72
|
+
<p-calendar sCalendarMask [(ngModel)]="data" dateFormat="dd/mm/yy" selectionMode="range" />
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Com limpeza automática de valor inválido
|
|
76
|
+
|
|
77
|
+
```html
|
|
78
|
+
<p-calendar sCalendarMask [autoClear]="true" [(ngModel)]="data" dateFormat="dd/mm/yy" />
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Acessibilidade
|
|
82
|
+
|
|
83
|
+
- A diretiva altera o `type` do input interno para `tel`, exibindo teclado numérico em dispositivos móveis
|
|
84
|
+
- A navegação por Tab é tratada pela diretiva para garantir o foco correto entre o input e o botão do calendário
|
|
85
|
+
- Use `aria-label` ou `<label for="...">` no `p-calendar` para associar corretamente o rótulo ao campo
|
|
86
|
+
|
|
87
|
+
## Componentes relacionados
|
|
88
|
+
|
|
89
|
+
- [`MaskFormatter`](../mask-formatter/README.md) — pipe de formatação de strings com máscara para exibição
|
package/card/README.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Card
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Componente container para agrupar conteúdo relacionado de forma visual e organizada. Suporta imagem de banner, templates personalizados para header, body e footer, ou uso simplificado com atributos.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Agrupar informações relacionadas em dashboards
|
|
10
|
+
- Exibir itens de lista com mais estrutura visual (portfólio, catálogo, galeria)
|
|
11
|
+
- Encapsular formulários ou seções de conteúdo com header e footer de ações
|
|
12
|
+
- Mostrar dados com imagem contextual no topo
|
|
13
|
+
|
|
14
|
+
## Quando não usar
|
|
15
|
+
|
|
16
|
+
- Para agrupamento simples de campos em formulários — use `Fieldset` em vez disso
|
|
17
|
+
- Quando o conteúdo precisa expandir/colapsar — use `Panel` (expansível) ou `Accordion`
|
|
18
|
+
- Para exibição de texto corrido sem necessidade de separação visual — use `<section>` nativo
|
|
19
|
+
|
|
20
|
+
## Instalação
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { CardModule } from '@seniorsistemas/angular-components/card';
|
|
24
|
+
import { TemplateModule } from '@seniorsistemas/angular-components/template';
|
|
25
|
+
|
|
26
|
+
@NgModule({
|
|
27
|
+
imports: [CardModule, TemplateModule],
|
|
28
|
+
})
|
|
29
|
+
export class MeuModule {}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Uso básico
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<s-card title="Título" subtitle="Subtítulo" icon="fas fa-rocket">
|
|
36
|
+
<p>Conteúdo via ng-content.</p>
|
|
37
|
+
</s-card>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## API
|
|
41
|
+
|
|
42
|
+
### Inputs
|
|
43
|
+
|
|
44
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
45
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
46
|
+
| `title` | `string` | `''` | não | Título exibido no cabeçalho |
|
|
47
|
+
| `subtitle` | `string` | `''` | não | Subtítulo exibido abaixo do título |
|
|
48
|
+
| `icon` | `string` | `''` | não | Classe do ícone no cabeçalho (ex.: `'fas fa-rocket'`) |
|
|
49
|
+
| `bannerImage` | `string` | `undefined` | não | URL da imagem de banner exibida no topo do card |
|
|
50
|
+
| `fullWidth` | `boolean` | `false` | não | Faz o card ocupar 100% da largura disponível |
|
|
51
|
+
|
|
52
|
+
### Tipos de template (via `sTemplate`)
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
type CardTemplateTypes = 'header' | 'body' | 'footer';
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Exemplos
|
|
59
|
+
|
|
60
|
+
### Card simples com ng-content
|
|
61
|
+
|
|
62
|
+
```html
|
|
63
|
+
<s-card>
|
|
64
|
+
<p>Conteúdo simples sem header configurado.</p>
|
|
65
|
+
</s-card>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Com header via inputs
|
|
69
|
+
|
|
70
|
+
```html
|
|
71
|
+
<s-card title="Informações do Usuário" subtitle="Dados cadastrais" icon="fas fa-user">
|
|
72
|
+
<p>Nome, e-mail e telefone.</p>
|
|
73
|
+
</s-card>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Com imagem de banner
|
|
77
|
+
|
|
78
|
+
```html
|
|
79
|
+
<s-card
|
|
80
|
+
bannerImage="https://exemplo.com/imagem.jpg"
|
|
81
|
+
title="Card com Banner"
|
|
82
|
+
subtitle="Exemplo de card com imagem">
|
|
83
|
+
<p>Conteúdo abaixo da imagem.</p>
|
|
84
|
+
</s-card>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Com template de footer (ações)
|
|
88
|
+
|
|
89
|
+
```html
|
|
90
|
+
<s-card title="Confirme a Ação" icon="fas fa-exclamation-triangle">
|
|
91
|
+
<p>Você tem certeza que deseja continuar?</p>
|
|
92
|
+
|
|
93
|
+
<ng-template sTemplate="footer">
|
|
94
|
+
<div style="display: flex; justify-content: flex-end; gap: 8px;">
|
|
95
|
+
<s-button label="Cancelar" priority="secondary"></s-button>
|
|
96
|
+
<s-button label="Confirmar" priority="danger"></s-button>
|
|
97
|
+
</div>
|
|
98
|
+
</ng-template>
|
|
99
|
+
</s-card>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Com templates completos (header, body e footer)
|
|
103
|
+
|
|
104
|
+
```html
|
|
105
|
+
<s-card [fullWidth]="true">
|
|
106
|
+
<ng-template sTemplate="header">
|
|
107
|
+
<div style="display: flex; justify-content: space-between; align-items: center;">
|
|
108
|
+
<strong>Header Customizado</strong>
|
|
109
|
+
<s-button label="Ação" priority="secondary" size="small"></s-button>
|
|
110
|
+
</div>
|
|
111
|
+
</ng-template>
|
|
112
|
+
|
|
113
|
+
<ng-template sTemplate="body">
|
|
114
|
+
<p>Corpo totalmente customizado.</p>
|
|
115
|
+
</ng-template>
|
|
116
|
+
|
|
117
|
+
<ng-template sTemplate="footer">
|
|
118
|
+
<div style="display: flex; justify-content: flex-end;">
|
|
119
|
+
<s-button label="Salvar" priority="primary"></s-button>
|
|
120
|
+
</div>
|
|
121
|
+
</ng-template>
|
|
122
|
+
</s-card>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Acessibilidade
|
|
126
|
+
|
|
127
|
+
- Use `title` e `subtitle` com textos descritivos para que leitores de tela entendam o contexto do card
|
|
128
|
+
- Quando o banner é apenas decorativo, ele não precisa de texto alternativo (é exibido como `background-image`)
|
|
129
|
+
- Botões no footer devem ter `label` ou `tooltip` claros
|
|
130
|
+
|
|
131
|
+
## Componentes relacionados
|
|
132
|
+
|
|
133
|
+
- [`Accordion`](../accordion/README.md) — quando o conteúdo do card precisa ser expansível/colapsável
|
package/chat/README.md
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Chat
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Componente para exibir conversas em formato de chat com mensagens enviadas e recebidas. Suporta thumbnail de usuário, timestamp, anexos e scroll automático para novas mensagens.
|
|
6
|
+
|
|
7
|
+
## Quando usar
|
|
8
|
+
|
|
9
|
+
- Exibir histórico de conversas entre usuários em módulos de mensageria
|
|
10
|
+
- Interfaces de suporte ao cliente com troca de mensagens
|
|
11
|
+
- Logs de comunicação entre sistemas ou usuários com contexto temporal
|
|
12
|
+
|
|
13
|
+
## Quando não usar
|
|
14
|
+
|
|
15
|
+
- Para construir um chat com campo de digitação — o componente exibe apenas o histórico; implemente o input separadamente
|
|
16
|
+
- Para exibir notificações ou feeds de atividade — use componentes de timeline ou lista de eventos
|
|
17
|
+
|
|
18
|
+
## Instalação
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import { ChatModule } from '@seniorsistemas/angular-components/chat';
|
|
22
|
+
|
|
23
|
+
@NgModule({
|
|
24
|
+
imports: [ChatModule],
|
|
25
|
+
})
|
|
26
|
+
export class MeuModule {}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
> **Dependência:** O componente usa `LocaleService` para formatar timestamps. Importe `LocaleModule` no módulo raiz:
|
|
30
|
+
>
|
|
31
|
+
> ```typescript
|
|
32
|
+
> import { LocaleModule } from '@seniorsistemas/angular-components/locale';
|
|
33
|
+
> @NgModule({ imports: [LocaleModule] })
|
|
34
|
+
> export class AppModule {}
|
|
35
|
+
> ```
|
|
36
|
+
|
|
37
|
+
## Uso básico
|
|
38
|
+
|
|
39
|
+
```html
|
|
40
|
+
<s-chat [messages]="mensagens" />
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## API
|
|
44
|
+
|
|
45
|
+
### Inputs
|
|
46
|
+
|
|
47
|
+
| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|
|
48
|
+
|-------------|------|--------|:-----------:|-----------|
|
|
49
|
+
| `messages` | `ChatMessage[]` | `[]` | não | Lista de mensagens exibidas no chat |
|
|
50
|
+
|
|
51
|
+
### Tipos
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
type ChatMessage = {
|
|
55
|
+
senderName: string; // Nome do remetente (obrigatório)
|
|
56
|
+
text: string; // Conteúdo da mensagem (obrigatório)
|
|
57
|
+
isMine: boolean; // true para mensagens do usuário atual (obrigatório)
|
|
58
|
+
thumbnailUrl?: string; // URL da foto do remetente (opcional)
|
|
59
|
+
sentAt?: Date; // Data/hora de envio (opcional)
|
|
60
|
+
attachmentUrl?: string; // URL do arquivo anexado (opcional)
|
|
61
|
+
};
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Exemplos
|
|
65
|
+
|
|
66
|
+
### Conversa básica
|
|
67
|
+
|
|
68
|
+
```html
|
|
69
|
+
<s-chat [messages]="mensagens"></s-chat>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
mensagens: ChatMessage[] = [
|
|
74
|
+
{
|
|
75
|
+
senderName: 'João Silva',
|
|
76
|
+
text: 'Olá! Tudo bem?',
|
|
77
|
+
thumbnailUrl: 'https://exemplo.com/foto-joao.jpg',
|
|
78
|
+
isMine: false,
|
|
79
|
+
sentAt: new Date('2025-01-28T10:00:00Z'),
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
senderName: 'Você',
|
|
83
|
+
text: 'Oi João! Tudo ótimo, e você?',
|
|
84
|
+
thumbnailUrl: 'https://exemplo.com/minha-foto.jpg',
|
|
85
|
+
isMine: true,
|
|
86
|
+
sentAt: new Date('2025-01-28T10:00:30Z'),
|
|
87
|
+
},
|
|
88
|
+
];
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Com anexo para download
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
mensagens: ChatMessage[] = [
|
|
95
|
+
{
|
|
96
|
+
senderName: 'Ana Costa',
|
|
97
|
+
text: 'Segue o relatório solicitado.',
|
|
98
|
+
isMine: false,
|
|
99
|
+
sentAt: new Date(),
|
|
100
|
+
attachmentUrl: 'https://exemplo.com/relatorio.pdf',
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Sem thumbnails e sem timestamps
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
mensagens: ChatMessage[] = [
|
|
109
|
+
{
|
|
110
|
+
senderName: 'Suporte',
|
|
111
|
+
text: 'Como posso ajudar?',
|
|
112
|
+
isMine: false,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
senderName: 'Usuário',
|
|
116
|
+
text: 'Preciso de ajuda com o sistema.',
|
|
117
|
+
isMine: true,
|
|
118
|
+
},
|
|
119
|
+
];
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Acessibilidade
|
|
123
|
+
|
|
124
|
+
- As mensagens são renderizadas em uma lista ordenada — leitores de tela anunciam o nome do remetente e o conteúdo
|
|
125
|
+
- Links de anexo possuem texto descritivo para leitores de tela
|
|
126
|
+
- O scroll automático é feito via `scrollIntoView` para garantir que novas mensagens sejam anunciadas
|
|
127
|
+
|
|
128
|
+
## Componentes relacionados
|
|
129
|
+
|
|
130
|
+
- [`Chips`](../chips/README.md) — quando a interface de chat precisa de entrada de tags/destinatários
|