feat(design-system): add reusable Badge primitive
Standalone, OnPush. Variants neutral/primary/success/warning/danger/info. Colors consumed via existing tenant CSS vars with fallbacks.
This commit is contained in:
1
src/app/shared/ui/badge/badge.component.html
Normal file
1
src/app/shared/ui/badge/badge.component.html
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<ng-content />
|
||||||
41
src/app/shared/ui/badge/badge.component.scss
Normal file
41
src/app/shared/ui/badge/badge.component.scss
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
:host {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: var(--space-xs, 0.25rem);
|
||||||
|
padding: 0.125rem var(--space-sm, 0.5rem);
|
||||||
|
border-radius: var(--radius-sm, 4px);
|
||||||
|
font-size: 0.75rem;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 1.4;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
:host.app-badge--neutral {
|
||||||
|
background: var(--bg-secondary, #f4f4f5);
|
||||||
|
color: var(--text-secondary, #6b7280);
|
||||||
|
}
|
||||||
|
|
||||||
|
:host.app-badge--primary {
|
||||||
|
background: color-mix(in srgb, var(--primary-color, #2f6e5d) 15%, transparent);
|
||||||
|
color: var(--primary-color, #2f6e5d);
|
||||||
|
}
|
||||||
|
|
||||||
|
:host.app-badge--success {
|
||||||
|
background: color-mix(in srgb, var(--success-color, #2e7d32) 15%, transparent);
|
||||||
|
color: var(--success-color, #2e7d32);
|
||||||
|
}
|
||||||
|
|
||||||
|
:host.app-badge--warning {
|
||||||
|
background: color-mix(in srgb, var(--warning-color, #b26a00) 15%, transparent);
|
||||||
|
color: var(--warning-color, #b26a00);
|
||||||
|
}
|
||||||
|
|
||||||
|
:host.app-badge--danger {
|
||||||
|
background: color-mix(in srgb, var(--error-color, #c0392b) 15%, transparent);
|
||||||
|
color: var(--error-color, #c0392b);
|
||||||
|
}
|
||||||
|
|
||||||
|
:host.app-badge--info {
|
||||||
|
background: color-mix(in srgb, var(--info-color, #1d6fa5) 15%, transparent);
|
||||||
|
color: var(--info-color, #1d6fa5);
|
||||||
|
}
|
||||||
22
src/app/shared/ui/badge/badge.component.ts
Normal file
22
src/app/shared/ui/badge/badge.component.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import { ChangeDetectionStrategy, Component, input } from '@angular/core';
|
||||||
|
|
||||||
|
export type BadgeVariant = 'neutral' | 'primary' | 'success' | 'warning' | 'danger' | 'info';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-badge',
|
||||||
|
standalone: true,
|
||||||
|
templateUrl: './badge.component.html',
|
||||||
|
styleUrl: './badge.component.scss',
|
||||||
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
|
host: {
|
||||||
|
'[class.app-badge--neutral]': "variant() === 'neutral'",
|
||||||
|
'[class.app-badge--primary]': "variant() === 'primary'",
|
||||||
|
'[class.app-badge--success]': "variant() === 'success'",
|
||||||
|
'[class.app-badge--warning]': "variant() === 'warning'",
|
||||||
|
'[class.app-badge--danger]': "variant() === 'danger'",
|
||||||
|
'[class.app-badge--info]': "variant() === 'info'"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
export class BadgeComponent {
|
||||||
|
readonly variant = input<BadgeVariant>('neutral');
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user