@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.
Files changed (76) hide show
  1. package/accordion/README.md +166 -0
  2. package/alert/README.md +92 -0
  3. package/autocomplete/README.md +162 -0
  4. package/badge/README.md +126 -0
  5. package/bignumber-input/README.md +122 -0
  6. package/breadcrumb/README.md +144 -0
  7. package/button/README.md +159 -0
  8. package/calendar-mask/README.md +89 -0
  9. package/card/README.md +133 -0
  10. package/chat/README.md +130 -0
  11. package/checkbox/README.md +108 -0
  12. package/checkbox-list/README.md +149 -0
  13. package/chips/README.md +152 -0
  14. package/code-editor/README.md +149 -0
  15. package/collapse-link/README.md +128 -0
  16. package/confirm-dialog/README.md +105 -0
  17. package/content-generator/README.md +111 -0
  18. package/control-errors/README.md +92 -0
  19. package/country-phone-picker/README.md +121 -0
  20. package/currency/README.md +90 -0
  21. package/custom-fields/README.md +142 -0
  22. package/dialog/README.md +152 -0
  23. package/dynamic-form/README.md +176 -0
  24. package/editable-overlay/README.md +98 -0
  25. package/empty-state/README.md +134 -0
  26. package/esm2022/loading-state/lib/loading-state/loading-state.component.mjs +4 -4
  27. package/fesm2022/seniorsistemas-angular-components-loading-state.mjs +3 -3
  28. package/fesm2022/seniorsistemas-angular-components-loading-state.mjs.map +1 -1
  29. package/fieldset/README.md +135 -0
  30. package/file-picker/README.md +162 -0
  31. package/file-upload/README.md +23 -7
  32. package/gantt/README.md +173 -0
  33. package/global-search/README.md +151 -0
  34. package/grid-menu/README.md +123 -0
  35. package/help-popover/README.md +134 -0
  36. package/ia-insight/README.md +24 -6
  37. package/image-cropper/README.md +140 -0
  38. package/infinite-scroll/README.md +130 -0
  39. package/info-sign/README.md +111 -0
  40. package/inline-edit/README.md +139 -0
  41. package/insights/README.md +159 -0
  42. package/interactive-content/README.md +120 -0
  43. package/kanban/README.md +184 -0
  44. package/label-value/README.md +154 -0
  45. package/loading-state/README.md +141 -0
  46. package/localized-number-input/README.md +128 -0
  47. package/mouse-events/README.md +157 -0
  48. package/navigation-button/README.md +160 -0
  49. package/numeric/README.md +147 -0
  50. package/numeric-mask/README.md +170 -0
  51. package/object-card/README.md +158 -0
  52. package/package.json +1 -1
  53. package/paginator/README.md +121 -0
  54. package/panel/README.md +147 -0
  55. package/password-strength/README.md +144 -0
  56. package/picklist/README.md +170 -0
  57. package/pin-code-field/README.md +137 -0
  58. package/product-header/README.md +33 -6
  59. package/profile-picture-picker/README.md +159 -0
  60. package/progressbar/README.md +136 -0
  61. package/radio-button/README.md +117 -0
  62. package/rating-scale/README.md +154 -0
  63. package/select/README.md +147 -0
  64. package/select-button/README.md +137 -0
  65. package/sidebar/README.md +117 -0
  66. package/slide-in-bar/README.md +122 -0
  67. package/slider/README.md +127 -0
  68. package/speech-recognition/README.md +104 -0
  69. package/split-button/README.md +126 -0
  70. package/spotlight/README.md +200 -0
  71. package/star-rating/README.md +127 -0
  72. package/stats-card/README.md +135 -0
  73. package/stepper/README.md +164 -0
  74. package/switch/README.md +125 -0
  75. package/table/README.md +185 -0
  76. package/text-area-ia/README.md +17 -6
@@ -0,0 +1,144 @@
1
+ # Breadcrumb
2
+
3
+ ![Status](https://img.shields.io/badge/status-stable-brightgreen)
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
@@ -0,0 +1,159 @@
1
+ # Button
2
+
3
+ ![Status](https://img.shields.io/badge/status-stable-brightgreen)
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
+ ![Status](https://img.shields.io/badge/status-stable-brightgreen)
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
+ ![Status](https://img.shields.io/badge/status-stable-brightgreen)
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
+ ![Status](https://img.shields.io/badge/status-stable-brightgreen)
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