diff --git a/src/app/features/componentes-test/pages/reutilizables-test-page/reutilizables-test-page.component.html b/src/app/features/componentes-test/pages/reutilizables-test-page/reutilizables-test-page.component.html index 1c59d49..92ad170 100644 --- a/src/app/features/componentes-test/pages/reutilizables-test-page/reutilizables-test-page.component.html +++ b/src/app/features/componentes-test/pages/reutilizables-test-page/reutilizables-test-page.component.html @@ -63,6 +63,57 @@
+
+

Icon Buttons

+

+ Botones de ícono pequeños con color base #666666, deshabilitados con #A0A0A0 y estados hover/active con color de marca (a excepción de trash que usa danger). +

+ +
+ +
+ Disabled +
+ + + + + + + +
+
+ + +
+ Normal +
+ + + + + + + +
+
+ + +
+ Active / Hover +
+ + + + + + + +
+
+
+
+
diff --git a/src/app/features/componentes-test/pages/reutilizables-test-page/reutilizables-test-page.component.scss b/src/app/features/componentes-test/pages/reutilizables-test-page/reutilizables-test-page.component.scss index f1586fd..55e27df 100644 --- a/src/app/features/componentes-test/pages/reutilizables-test-page/reutilizables-test-page.component.scss +++ b/src/app/features/componentes-test/pages/reutilizables-test-page/reutilizables-test-page.component.scss @@ -244,3 +244,44 @@ h1 { } } } + +.icon-button-showcase { + display: grid; + gap: 1.5rem; + + &__grid { + display: grid; + gap: 1.5rem; + background-color: #eaeaea; + padding: 1.5rem; + border-radius: 8px; + border: 1px solid #dee2e6; + } + + &__row { + display: grid; + grid-template-columns: 160px 1fr; + align-items: center; + gap: 1.5rem; + + @media (max-width: 575.98px) { + grid-template-columns: minmax(0, 1fr); + gap: 0.5rem; + } + } + + &__label { + font-size: 0.875rem; + font-weight: 700; + text-transform: uppercase; + color: #495057; + letter-spacing: 0.05em; + } + + &__items { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 1.5rem; + } +} diff --git a/src/app/features/componentes-test/pages/reutilizables-test-page/reutilizables-test-page.component.ts b/src/app/features/componentes-test/pages/reutilizables-test-page/reutilizables-test-page.component.ts index 767e865..c1db031 100644 --- a/src/app/features/componentes-test/pages/reutilizables-test-page/reutilizables-test-page.component.ts +++ b/src/app/features/componentes-test/pages/reutilizables-test-page/reutilizables-test-page.component.ts @@ -5,12 +5,21 @@ import { InputComponent } from '../../../../shared/components/input/input.compon import { PaginatorComponent } from '../../../../shared/components/paginator/paginator.component'; import { ProductCardComponent } from '../../../../shared/components/product-card/product-card.component'; import { StoreSectionComponent } from '../../../../shared/components/store-section/store-section.component'; +import { IconButtonComponent } from '../../../../shared/components/icon-button/icon-button.component'; import { TenantService } from '../../../../core/services/tenant.service'; import { ToastService } from '../../../../core/services/toast.service'; @Component({ selector: 'app-reutilizables-test-page', - imports: [ButtonComponent, CartComponent, InputComponent, PaginatorComponent, ProductCardComponent, StoreSectionComponent], + imports: [ + ButtonComponent, + CartComponent, + InputComponent, + PaginatorComponent, + ProductCardComponent, + StoreSectionComponent, + IconButtonComponent + ], templateUrl: './reutilizables-test-page.component.html', styleUrl: './reutilizables-test-page.component.scss' }) diff --git a/src/app/shared/components/cart-item/cart-item.component.html b/src/app/shared/components/cart-item/cart-item.component.html index 0bb1480..583c1f0 100644 --- a/src/app/shared/components/cart-item/cart-item.component.html +++ b/src/app/shared/components/cart-item/cart-item.component.html @@ -41,9 +41,11 @@ (increase)="onIncrease()" (decrease)="onDecrease()" /> - +
diff --git a/src/app/shared/components/cart-item/cart-item.component.scss b/src/app/shared/components/cart-item/cart-item.component.scss index 7553a99..43ad442 100644 --- a/src/app/shared/components/cart-item/cart-item.component.scss +++ b/src/app/shared/components/cart-item/cart-item.component.scss @@ -96,10 +96,5 @@ .cart-item-remove-btn { - width: 18px; - height: 18px; margin-left: 0.35rem; - padding: 0; - color: #b3b3b3; - font-size: 12px; } diff --git a/src/app/shared/components/cart-item/cart-item.component.ts b/src/app/shared/components/cart-item/cart-item.component.ts index 68465cb..15921e1 100644 --- a/src/app/shared/components/cart-item/cart-item.component.ts +++ b/src/app/shared/components/cart-item/cart-item.component.ts @@ -1,5 +1,6 @@ import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core'; import { QuantitySelectorComponent } from '../quantity-selector/quantity-selector.component'; +import { IconButtonComponent } from '../icon-button/icon-button.component'; export interface CartItemAttribute { label: string; @@ -9,7 +10,7 @@ export interface CartItemAttribute { @Component({ selector: 'app-cart-item', standalone: true, - imports: [QuantitySelectorComponent], + imports: [QuantitySelectorComponent, IconButtonComponent], templateUrl: './cart-item.component.html', styleUrl: './cart-item.component.scss', changeDetection: ChangeDetectionStrategy.OnPush diff --git a/src/app/shared/components/icon-button/icon-button.component.html b/src/app/shared/components/icon-button/icon-button.component.html new file mode 100644 index 0000000..c7318a3 --- /dev/null +++ b/src/app/shared/components/icon-button/icon-button.component.html @@ -0,0 +1,8 @@ + diff --git a/src/app/shared/components/icon-button/icon-button.component.scss b/src/app/shared/components/icon-button/icon-button.component.scss new file mode 100644 index 0000000..d4ef0dd --- /dev/null +++ b/src/app/shared/components/icon-button/icon-button.component.scss @@ -0,0 +1,64 @@ +:host { + display: inline-block; + vertical-align: middle; +} + +.icon-btn { + display: inline-flex; + align-items: center; + justify-content: center; + background: transparent; + border: none; + padding: 4px; + margin: 0; + color: #666666; + font-size: 20px; + cursor: pointer; + outline: none; + transition: color 0.15s ease-in-out, transform 0.1s ease-in-out; + border-radius: 4px; + + i { + display: inline-block; + line-height: 1; + } + + // Active state subtle scale down + &:active:not(:disabled) { + transform: scale(0.92); + } + + // Focus ring for accessibility + &:focus-visible { + outline: 2px solid var(--tenant-primary); + outline-offset: 2px; + } + + // Disabled state + &:disabled { + color: #A0A0A0; + cursor: not-allowed; + pointer-events: none; + } +} + +// Hover/Active/Focus colors (non-disabled) +.icon-btn:hover:not(:disabled), +.icon-btn:focus-visible:not(:disabled), +.icon-btn.hover-preview:not(:disabled), +:host(.hover-preview) .icon-btn:not(:disabled) { + color: var(--tenant-primary); +} + +// Trash is special (uses danger color for hover/active) +.icon-btn--trash { + &:hover:not(:disabled), + &:focus-visible:not(:disabled), + &.hover-preview:not(:disabled) { + color: var(--tenant-danger); + } +} + +:host(.hover-preview) .icon-btn--trash:not(:disabled) { + color: var(--tenant-danger); +} diff --git a/src/app/shared/components/icon-button/icon-button.component.ts b/src/app/shared/components/icon-button/icon-button.component.ts new file mode 100644 index 0000000..140292f --- /dev/null +++ b/src/app/shared/components/icon-button/icon-button.component.ts @@ -0,0 +1,41 @@ +import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core'; +import { NgClass } from '@angular/common'; + +export type IconButtonVariant = + | 'user' + | 'trash' + | 'angle-right' + | 'angle-left' + | 'angle-up' + | 'angle-down' + | 'copy'; + +@Component({ + selector: 'app-icon-button', + imports: [NgClass], + templateUrl: './icon-button.component.html', + styleUrl: './icon-button.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class IconButtonComponent { + readonly variant = input.required(); + readonly disabled = input(false); + readonly ariaLabel = input(''); + + protected readonly iconClass = computed(() => { + const classes: Record = { + user: 'fa-regular fa-circle-user', + trash: 'fa-solid fa-trash', + 'angle-right': 'fa-solid fa-angle-right', + 'angle-left': 'fa-solid fa-angle-left', + 'angle-up': 'fa-solid fa-angle-up', + 'angle-down': 'fa-solid fa-angle-down', + copy: 'fa-solid fa-copy' + }; + return classes[this.variant()]; + }); + + protected readonly buttonClasses = computed(() => { + return ['icon-btn', `icon-btn--${this.variant()}`]; + }); +}