diff --git a/src/app/components/custom-select/custom-select.html b/src/app/components/custom-select/custom-select.html
index 6fd6bb0..6d8edf2 100644
--- a/src/app/components/custom-select/custom-select.html
+++ b/src/app/components/custom-select/custom-select.html
@@ -6,6 +6,7 @@
[attr.aria-expanded]="isOpen"
[attr.aria-disabled]="disabled"
>
+
{{ displayLabel }}
diff --git a/src/app/components/custom-select/custom-select.scss b/src/app/components/custom-select/custom-select.scss
index 4ffab52..99c00d5 100644
--- a/src/app/components/custom-select/custom-select.scss
+++ b/src/app/components/custom-select/custom-select.scss
@@ -67,6 +67,12 @@
padding-right: 24px;
}
+.app-select-leading-icon {
+ flex: 0 0 auto;
+ color: #64748b;
+ font-size: 13px;
+}
+
.app-select-label {
flex: 1 1 auto;
min-width: 0;
diff --git a/src/app/components/custom-select/custom-select.ts b/src/app/components/custom-select/custom-select.ts
index 820eef0..6477190 100644
--- a/src/app/components/custom-select/custom-select.ts
+++ b/src/app/components/custom-select/custom-select.ts
@@ -29,6 +29,7 @@ export class CustomSelectComponent implements ControlValueAccessor, OnDestroy {
@Input() disabled = false;
@Input() searchable = false;
@Input() searchPlaceholder = 'Pesquisar...';
+ @Input() leadingIcon = '';
isOpen = false;
value: any = null;
diff --git a/src/app/components/smart-search-input/smart-search-input.html b/src/app/components/smart-search-input/smart-search-input.html
new file mode 100644
index 0000000..95b0404
--- /dev/null
+++ b/src/app/components/smart-search-input/smart-search-input.html
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/app/components/smart-search-input/smart-search-input.scss b/src/app/components/smart-search-input/smart-search-input.scss
new file mode 100644
index 0000000..5821e21
--- /dev/null
+++ b/src/app/components/smart-search-input/smart-search-input.scss
@@ -0,0 +1,72 @@
+:host {
+ min-width: 0;
+}
+
+.smart-search-group {
+ width: 100%;
+ border-radius: 12px;
+ overflow: hidden;
+ display: flex;
+ align-items: stretch;
+ background: #fff;
+ border: 1px solid rgba(17, 18, 20, 0.15);
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.04);
+ transition: all 0.2s ease;
+
+ &:focus-within {
+ border-color: var(--brand, #E33DCF);
+ box-shadow: 0 4px 12px rgba(227, 61, 207, 0.15);
+ transform: translateY(-1px);
+ }
+}
+
+.input-group-text {
+ background: transparent;
+ border: none;
+ color: rgba(17, 18, 20, 0.65);
+ padding-left: 14px;
+ padding-right: 8px;
+ display: flex;
+ align-items: center;
+
+ i {
+ font-size: 1rem;
+ }
+}
+
+.form-control {
+ border: none;
+ background: transparent;
+ padding: 10px 0;
+ font-size: 0.9rem;
+ color: #111214;
+ box-shadow: none;
+
+ &::placeholder {
+ color: rgba(17, 18, 20, 0.4);
+ font-weight: 500;
+ }
+
+ &:focus {
+ outline: none;
+ }
+}
+
+.btn-clear {
+ background: transparent;
+ border: none;
+ color: rgba(17, 18, 20, 0.65);
+ padding: 0 12px;
+ display: flex;
+ align-items: center;
+ cursor: pointer;
+ transition: color 0.2s;
+
+ &:hover:not(:disabled) {
+ color: #dc3545;
+ }
+
+ i {
+ font-size: 1rem;
+ }
+}
diff --git a/src/app/components/smart-search-input/smart-search-input.ts b/src/app/components/smart-search-input/smart-search-input.ts
new file mode 100644
index 0000000..6a5c711
--- /dev/null
+++ b/src/app/components/smart-search-input/smart-search-input.ts
@@ -0,0 +1,71 @@
+import { CommonModule } from '@angular/common';
+import { Component, HostBinding, Input, forwardRef } from '@angular/core';
+import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
+
+@Component({
+ selector: 'app-smart-search-input',
+ standalone: true,
+ imports: [CommonModule],
+ templateUrl: './smart-search-input.html',
+ styleUrls: ['./smart-search-input.scss'],
+ providers: [
+ {
+ provide: NG_VALUE_ACCESSOR,
+ useExisting: forwardRef(() => SmartSearchInputComponent),
+ multi: true,
+ },
+ ],
+})
+export class SmartSearchInputComponent implements ControlValueAccessor {
+ @Input() placeholder = 'Pesquisar...';
+ @Input() loading = false;
+ @Input() disabled = false;
+ @Input() maxWidth = '270px';
+
+ @HostBinding('style.display') readonly hostDisplay = 'block';
+
+ @HostBinding('style.width')
+ get hostWidth(): string {
+ return this.maxWidth === '100%' ? '100%' : `min(100%, ${this.maxWidth})`;
+ }
+
+ value = '';
+
+ private onChange: (value: string) => void = () => {};
+ private onTouched: () => void = () => {};
+
+ writeValue(value: string | null | undefined): void {
+ this.value = value ?? '';
+ }
+
+ registerOnChange(fn: (value: string) => void): void {
+ this.onChange = fn;
+ }
+
+ registerOnTouched(fn: () => void): void {
+ this.onTouched = fn;
+ }
+
+ setDisabledState(isDisabled: boolean): void {
+ this.disabled = isDisabled;
+ }
+
+ onInput(event: Event): void {
+ const nextValue = (event.target as HTMLInputElement | null)?.value ?? '';
+ this.value = nextValue;
+ this.onChange(nextValue);
+ }
+
+ clear(event?: Event): void {
+ event?.stopPropagation();
+ if (!this.value) return;
+
+ this.value = '';
+ this.onChange('');
+ this.onTouched();
+ }
+
+ onBlur(): void {
+ this.onTouched();
+ }
+}
diff --git a/src/app/pages/geral/geral.html b/src/app/pages/geral/geral.html
index 3ee8341..f7e4509 100644
--- a/src/app/pages/geral/geral.html
+++ b/src/app/pages/geral/geral.html
@@ -46,31 +46,31 @@
class="btn btn-glass btn-sm header-action-btn header-action-btn-export"
(click)="onExport()"
[disabled]="loading || exporting">
- Exportar
- Exportando...
+
+