@dev-tcloud/tcloud-ui 6.17.0 → 6.19.0-beta.1

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.
@@ -0,0 +1,136 @@
1
+ # Input
2
+
3
+ A diretiva **tcloudUiInput** padroniza o estilo visual de campos de formulário (`input` e `select`) com o design revitalizado do TCloud UI. Ela aplica automaticamente a classe base de controle e permite expandir o campo para largura total via input reativo.
4
+
5
+ ## Características
6
+
7
+ - **Estilização automática**: adiciona a classe `tc-rev-input-control` ao elemento host
8
+ - **Suporte a `input` e `select`**: funciona com `input[tcloudUiInput]` e `select[tcloudUiInput]`
9
+ - **Largura opcional**: quando `fullWidth` é `true`, adiciona a classe `tc-rev-input-control--full-width`
10
+ - **API simples**: possui apenas um input (`fullWidth`) para controle de layout
11
+ - **Reatividade com Signals**: utiliza `input()` e `effect()` do Angular para reagir a mudanças do estado
12
+
13
+ ## Instalação
14
+
15
+ ```typescript
16
+ import { TCloudUiInputDirective } from 'projects/tcloud-ui/src/public-api';
17
+
18
+ @Component({
19
+ imports: [TCloudUiInputDirective],
20
+ // ... resto da configuração
21
+ })
22
+ export class MyComponent {}
23
+ ```
24
+
25
+ ## Propriedades (API)
26
+
27
+ ### Seletor
28
+
29
+ | Nome | Tipo | Descrição |
30
+ |------|------|-----------|
31
+ | `input[tcloudUiInput]` | Diretiva de atributo | Aplica o estilo base em campos `input` |
32
+ | `select[tcloudUiInput]` | Diretiva de atributo | Aplica o estilo base em campos `select` |
33
+
34
+ ### Inputs
35
+
36
+ | Nome | Tipo | Descrição | Valor Default |
37
+ |------|------|-----------|---------------|
38
+ | `fullWidth` | `boolean` | Quando `true`, adiciona a classe `tc-rev-input-control--full-width` para ocupar 100% da largura disponível | `false` |
39
+
40
+ ### Classes aplicadas
41
+
42
+ | Classe CSS | Quando é aplicada |
43
+ |-----------|-------------------|
44
+ | `tc-rev-input-control` | Sempre que a diretiva está presente no host |
45
+ | `tc-rev-input-control--full-width` | Quando `fullWidth` é `true` |
46
+
47
+ ## Exemplos de Uso
48
+
49
+ ### Uso Básico com Input
50
+
51
+ ```html
52
+ <input tcloudUiInput type="text" placeholder="Digite seu nome" />
53
+ ```
54
+
55
+ ### Uso Básico com Select
56
+
57
+ ```html
58
+ <select tcloudUiInput>
59
+ <option value="">Selecione uma opção</option>
60
+ <option value="1">Opção 1</option>
61
+ <option value="2">Opção 2</option>
62
+ </select>
63
+ ```
64
+
65
+ ### Uso com Full Width
66
+
67
+ ```html
68
+ <input tcloudUiInput [fullWidth]="true" type="email" placeholder="email@empresa.com" />
69
+ ```
70
+
71
+ ### Controle Programático de Largura
72
+
73
+ ```typescript
74
+ @Component({
75
+ selector: 'app-form-example',
76
+ imports: [TCloudUiInputDirective],
77
+ template: `
78
+ <button class="tc-btn" (click)="toggleFullWidth()">
79
+ {{ isFullWidth ? 'Largura padrão' : 'Largura total' }}
80
+ </button>
81
+
82
+ <input
83
+ tcloudUiInput
84
+ [fullWidth]="isFullWidth"
85
+ type="text"
86
+ placeholder="Campo com largura controlada"
87
+ />
88
+ `
89
+ })
90
+ export class FormExampleComponent {
91
+ isFullWidth: boolean = false;
92
+
93
+ toggleFullWidth(): void {
94
+ this.isFullWidth = !this.isFullWidth;
95
+ }
96
+ }
97
+ ```
98
+
99
+ ### Integração com Reactive Forms
100
+
101
+ ```typescript
102
+ @Component({
103
+ selector: 'app-reactive-form-example',
104
+ imports: [ReactiveFormsModule, TCloudUiInputDirective],
105
+ template: `
106
+ <form [formGroup]="form">
107
+ <input
108
+ tcloudUiInput
109
+ formControlName="name"
110
+ [fullWidth]="true"
111
+ type="text"
112
+ placeholder="Nome completo"
113
+ />
114
+
115
+ <select tcloudUiInput formControlName="role">
116
+ <option value="">Selecione o perfil</option>
117
+ <option value="admin">Administrador</option>
118
+ <option value="user">Usuário</option>
119
+ </select>
120
+ </form>
121
+ `
122
+ })
123
+ export class ReactiveFormExampleComponent {
124
+ form = new FormGroup({
125
+ name: new FormControl(''),
126
+ role: new FormControl('')
127
+ });
128
+ }
129
+ ```
130
+
131
+ ## Notas de Implementação
132
+
133
+ - A diretiva utiliza `host.class` para garantir a aplicação da classe base `tc-rev-input-control`
134
+ - O estado de `fullWidth` é definido com Angular Signals (`input<boolean>(false)`)
135
+ - A atualização da classe adicional é acionada por um `effect()` no construtor
136
+ - O `ElementRef` é usado para manipulação direta da lista de classes do elemento host
@@ -7588,6 +7588,7 @@ class TCloudUiPaginationComponent {
7588
7588
  constructor() {
7589
7589
  this._id = 'tcloud-ui-pagination-component-alone';
7590
7590
  this._currentPage = 1;
7591
+ this._enableLoadOnDemand = false;
7591
7592
  this._tcloudUiPaginationService = inject(TCloudUiPaginationService);
7592
7593
  this._changeDetectorRef = inject(ChangeDetectorRef);
7593
7594
  this._lastTotalPages = 1;
@@ -7610,6 +7611,12 @@ class TCloudUiPaginationComponent {
7610
7611
  get currentPage() {
7611
7612
  return this._currentPage;
7612
7613
  }
7614
+ set enableLoadOnDemand(value) {
7615
+ this._enableLoadOnDemand = value;
7616
+ }
7617
+ get enableLoadOnDemand() {
7618
+ return this._enableLoadOnDemand;
7619
+ }
7613
7620
  ngOnInit() {
7614
7621
  this._tcloudUiPaginationService.stateTotal$.subscribe((items) => {
7615
7622
  let pagination = {};
@@ -7688,18 +7695,20 @@ class TCloudUiPaginationComponent {
7688
7695
  return page < 10 ? `0${page}` : `${page}`;
7689
7696
  }
7690
7697
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: TCloudUiPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
7691
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.21", type: TCloudUiPaginationComponent, isStandalone: true, selector: "tcloud-ui-pagination", inputs: { id: "id", currentPage: "currentPage" }, outputs: { pageChange: "pageChange" }, ngImport: i0, template: "<div class=\"pagination-container\">\n\t<button class=\"arrow\" [disabled]=\"currentPage === 1\" (click)=\"previous()\"><i class=\"fas fa-angle-left\"></i></button>\n\n\t<span class=\"label f-family f-weight-600 f-size-14 c-neutral-700\">P\u00E1gina</span>\n\n\t<div class=\"page-input-container\">\n\t\t<input\n\t\t\ttype=\"text\"\n\t\t\tclass=\"page-input\"\n\t\t\t[ngClass]=\"{'error': pageInputError}\"\n\t\t\t[value]=\"formatPage(currentPage)\"\n\t\t\t(keyup.enter)=\"goToPage($event)\"\n\t\t\t(blur)=\"goToPage($event)\"\n\t\t/>\n\t</div>\n\n\t<span class=\"label f-family f-weight-600 f-size-14 c-neutral-700\">de\n\t\t{{ totalPages }}\n\t</span>\n\n\t<button class=\"arrow\" [disabled]=\"currentPage === totalPages\" (click)=\"next()\"><i class=\"fas fa-angle-right\"></i></button>\n</div>\n", styles: [":host{display:block}.pagination-container{display:flex;align-items:center;gap:8px;font-family:var(--f-family);justify-content:center}.pagination-container .label{color:var(--c-neutral-700)}.pagination-container .page-input-container{position:relative;width:48px;height:32px}.pagination-container .page-input{width:100%;height:100%;padding:var(--size-4) var(--size-8);border:1px solid var(--c-neutral-300);border-radius:var(--bor-radius-8);font-size:var(--f-size-14);font-family:var(--f-family);font-weight:var(--f-weight-600);color:var(--c-neutral-700);text-align:center;background-color:var(--c-neutral-50);outline:none;transition:border-color .2s ease}.pagination-container .page-input:focus:not(.error){border-color:var(--c-primary-500)}.pagination-container .page-input.error{border-color:var(--c-danger-500)}.pagination-container .page-input.error:focus{border-color:var(--c-danger-500)}.pagination-container .arrow{background-color:var(--c-neutral-100);border:1px solid var(--c-neutral-300);border-radius:var(--bor-radius-8);width:32px;height:32px;font-size:var(--f-size-16);color:var(--c-neutral-300);cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center}.pagination-container .arrow:disabled{cursor:not-allowed;opacity:.5}.pagination-container .arrow:hover:not(:disabled){background-color:var(--c-primary-100);border-color:var(--c-primary-300);color:var(--c-primary-500)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
7698
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.21", type: TCloudUiPaginationComponent, isStandalone: true, selector: "tcloud-ui-pagination", inputs: { id: "id", currentPage: "currentPage", enableLoadOnDemand: "enableLoadOnDemand" }, outputs: { pageChange: "pageChange" }, ngImport: i0, template: "<div class=\"pagination-container\">\n\t<button class=\"arrow\" [disabled]=\"currentPage === 1\" (click)=\"previous()\"><i class=\"fas fa-angle-left\"></i></button>\n\n\t<span class=\"label f-family f-weight-600 f-size-14 c-neutral-700\">P\u00E1gina</span>\n\n\t<div class=\"page-input-container\">\n\t\t<input\n\t\t\ttype=\"text\"\n\t\t\tclass=\"page-input\"\n\t\t\t[ngClass]=\"{'error': pageInputError}\"\n\t\t\t[value]=\"formatPage(currentPage)\"\n\t\t\t(keyup.enter)=\"goToPage($event)\"\n\t\t\t(blur)=\"goToPage($event)\"\n\t\t/>\n\t</div>\n\n\t<span class=\"label f-family f-weight-600 f-size-14 c-neutral-700\">de\n\t\t{{ totalPages }}\n\t</span>\n\n\t<button class=\"arrow\" [disabled]=\"currentPage === totalPages && !enableLoadOnDemand\" (click)=\"next()\"><i class=\"fas fa-angle-right\"></i></button>\n</div>\n", styles: [":host{display:block}.pagination-container{display:flex;align-items:center;gap:8px;font-family:var(--f-family);justify-content:center}.pagination-container .label{color:var(--c-neutral-700)}.pagination-container .page-input-container{position:relative;width:48px;height:32px}.pagination-container .page-input{width:100%;height:100%;padding:var(--size-4) var(--size-8);border:1px solid var(--c-neutral-300);border-radius:var(--bor-radius-8);font-size:var(--f-size-14);font-family:var(--f-family);font-weight:var(--f-weight-600);color:var(--c-neutral-700);text-align:center;background-color:var(--c-neutral-50);outline:none;transition:border-color .2s ease}.pagination-container .page-input:focus:not(.error){border-color:var(--c-primary-500)}.pagination-container .page-input.error{border-color:var(--c-danger-500)}.pagination-container .page-input.error:focus{border-color:var(--c-danger-500)}.pagination-container .arrow{background-color:var(--c-neutral-100);border:1px solid var(--c-neutral-300);border-radius:var(--bor-radius-8);width:32px;height:32px;font-size:var(--f-size-16);color:var(--c-neutral-300);cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center}.pagination-container .arrow:disabled{cursor:not-allowed;opacity:.5}.pagination-container .arrow:hover:not(:disabled){background-color:var(--c-primary-100);border-color:var(--c-primary-300);color:var(--c-primary-500)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
7692
7699
  }
7693
7700
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: TCloudUiPaginationComponent, decorators: [{
7694
7701
  type: Component,
7695
7702
  args: [{ selector: 'tcloud-ui-pagination', imports: [
7696
7703
  CommonModule,
7697
7704
  TCloudUiPaginationPipe
7698
- ], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"pagination-container\">\n\t<button class=\"arrow\" [disabled]=\"currentPage === 1\" (click)=\"previous()\"><i class=\"fas fa-angle-left\"></i></button>\n\n\t<span class=\"label f-family f-weight-600 f-size-14 c-neutral-700\">P\u00E1gina</span>\n\n\t<div class=\"page-input-container\">\n\t\t<input\n\t\t\ttype=\"text\"\n\t\t\tclass=\"page-input\"\n\t\t\t[ngClass]=\"{'error': pageInputError}\"\n\t\t\t[value]=\"formatPage(currentPage)\"\n\t\t\t(keyup.enter)=\"goToPage($event)\"\n\t\t\t(blur)=\"goToPage($event)\"\n\t\t/>\n\t</div>\n\n\t<span class=\"label f-family f-weight-600 f-size-14 c-neutral-700\">de\n\t\t{{ totalPages }}\n\t</span>\n\n\t<button class=\"arrow\" [disabled]=\"currentPage === totalPages\" (click)=\"next()\"><i class=\"fas fa-angle-right\"></i></button>\n</div>\n", styles: [":host{display:block}.pagination-container{display:flex;align-items:center;gap:8px;font-family:var(--f-family);justify-content:center}.pagination-container .label{color:var(--c-neutral-700)}.pagination-container .page-input-container{position:relative;width:48px;height:32px}.pagination-container .page-input{width:100%;height:100%;padding:var(--size-4) var(--size-8);border:1px solid var(--c-neutral-300);border-radius:var(--bor-radius-8);font-size:var(--f-size-14);font-family:var(--f-family);font-weight:var(--f-weight-600);color:var(--c-neutral-700);text-align:center;background-color:var(--c-neutral-50);outline:none;transition:border-color .2s ease}.pagination-container .page-input:focus:not(.error){border-color:var(--c-primary-500)}.pagination-container .page-input.error{border-color:var(--c-danger-500)}.pagination-container .page-input.error:focus{border-color:var(--c-danger-500)}.pagination-container .arrow{background-color:var(--c-neutral-100);border:1px solid var(--c-neutral-300);border-radius:var(--bor-radius-8);width:32px;height:32px;font-size:var(--f-size-16);color:var(--c-neutral-300);cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center}.pagination-container .arrow:disabled{cursor:not-allowed;opacity:.5}.pagination-container .arrow:hover:not(:disabled){background-color:var(--c-primary-100);border-color:var(--c-primary-300);color:var(--c-primary-500)}\n"] }]
7705
+ ], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"pagination-container\">\n\t<button class=\"arrow\" [disabled]=\"currentPage === 1\" (click)=\"previous()\"><i class=\"fas fa-angle-left\"></i></button>\n\n\t<span class=\"label f-family f-weight-600 f-size-14 c-neutral-700\">P\u00E1gina</span>\n\n\t<div class=\"page-input-container\">\n\t\t<input\n\t\t\ttype=\"text\"\n\t\t\tclass=\"page-input\"\n\t\t\t[ngClass]=\"{'error': pageInputError}\"\n\t\t\t[value]=\"formatPage(currentPage)\"\n\t\t\t(keyup.enter)=\"goToPage($event)\"\n\t\t\t(blur)=\"goToPage($event)\"\n\t\t/>\n\t</div>\n\n\t<span class=\"label f-family f-weight-600 f-size-14 c-neutral-700\">de\n\t\t{{ totalPages }}\n\t</span>\n\n\t<button class=\"arrow\" [disabled]=\"currentPage === totalPages && !enableLoadOnDemand\" (click)=\"next()\"><i class=\"fas fa-angle-right\"></i></button>\n</div>\n", styles: [":host{display:block}.pagination-container{display:flex;align-items:center;gap:8px;font-family:var(--f-family);justify-content:center}.pagination-container .label{color:var(--c-neutral-700)}.pagination-container .page-input-container{position:relative;width:48px;height:32px}.pagination-container .page-input{width:100%;height:100%;padding:var(--size-4) var(--size-8);border:1px solid var(--c-neutral-300);border-radius:var(--bor-radius-8);font-size:var(--f-size-14);font-family:var(--f-family);font-weight:var(--f-weight-600);color:var(--c-neutral-700);text-align:center;background-color:var(--c-neutral-50);outline:none;transition:border-color .2s ease}.pagination-container .page-input:focus:not(.error){border-color:var(--c-primary-500)}.pagination-container .page-input.error{border-color:var(--c-danger-500)}.pagination-container .page-input.error:focus{border-color:var(--c-danger-500)}.pagination-container .arrow{background-color:var(--c-neutral-100);border:1px solid var(--c-neutral-300);border-radius:var(--bor-radius-8);width:32px;height:32px;font-size:var(--f-size-16);color:var(--c-neutral-300);cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center}.pagination-container .arrow:disabled{cursor:not-allowed;opacity:.5}.pagination-container .arrow:hover:not(:disabled){background-color:var(--c-primary-100);border-color:var(--c-primary-300);color:var(--c-primary-500)}\n"] }]
7699
7706
  }], propDecorators: { id: [{
7700
7707
  type: Input
7701
7708
  }], currentPage: [{
7702
7709
  type: Input
7710
+ }], enableLoadOnDemand: [{
7711
+ type: Input
7703
7712
  }], pageChange: [{
7704
7713
  type: Output
7705
7714
  }] } });