Skip to content

Commit 10e2af4

Browse files
committed
feat(badge): implement standard configuration
1 parent 7142595 commit 10e2af4

File tree

3 files changed

+211
-31
lines changed

3 files changed

+211
-31
lines changed

libs/flowbite-angular/badge/badge.component.ts

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { BadgeClass, BadgeColors, BadgeSizes, BadgeTheme } from './badge.theme';
22
import { BadgeThemeService } from './badge.theme.service';
33

4-
import type { DeepPartial } from 'flowbite-angular';
4+
import type { DeepPartial, StandardThemeInput } from 'flowbite-angular';
55
import { BaseComponent, booleanToFlowbiteBoolean } from 'flowbite-angular';
66
import { IconComponent, IconRegistry } from 'flowbite-angular/icon';
77
import { FlowbiteRouterLinkDirective } from 'flowbite-angular/router-link';
@@ -38,6 +38,9 @@ export const FLOWBITE_BADGE_IS_PILL_DEFAULT_VALUE = new InjectionToken<boolean>(
3838
'FLOWBITE_BADGE_IS_PILL_DEFAULT_VALUE'
3939
);
4040

41+
export const FLOWBITE_BADGE_STANDARD_THEME_CONFIG_DEFAULT_VALUE =
42+
new InjectionToken<StandardThemeInput>('FLOWBITE_BADGE_STANDARD_THEME_CONFIG_DEFAULT_VALUE');
43+
4144
export const FLOWBITE_BADGE_CUSTOM_STYLE_DEFAULT_VALUE = new InjectionToken<
4245
DeepPartial<BadgeTheme>
4346
>('FLOWBITE_BADGE_CUSTOM_STYLE_DEFAULT_VALUE');
@@ -71,6 +74,10 @@ export const badgeDefaultValueProvider = makeEnvironmentProviders([
7174
provide: FLOWBITE_BADGE_IS_PILL_DEFAULT_VALUE,
7275
useValue: false,
7376
},
77+
{
78+
provide: FLOWBITE_BADGE_STANDARD_THEME_CONFIG_DEFAULT_VALUE,
79+
useValue: { hasDark: true, hasHover: true, hasFocus: false, hasDisabled: false },
80+
},
7481
{
7582
provide: FLOWBITE_BADGE_CUSTOM_STYLE_DEFAULT_VALUE,
7683
useValue: {},
@@ -159,6 +166,13 @@ export class BadgeComponent extends BaseComponent<BadgeClass> {
159166
* @default false
160167
*/
161168
public isPill = model(inject(FLOWBITE_BADGE_IS_PILL_DEFAULT_VALUE));
169+
/**
170+
* Set the standard theme configuration for this badge
171+
*
172+
* @default
173+
* { hasDark: true, hasHover: true, hasFocus: false, hasDisabled: false }
174+
*/
175+
public standardThemeConfig = model(inject(FLOWBITE_BADGE_STANDARD_THEME_CONFIG_DEFAULT_VALUE));
162176
/**
163177
* Set the custom style for this badge
164178
*/
@@ -186,6 +200,7 @@ export class BadgeComponent extends BaseComponent<BadgeClass> {
186200
isIconOnly: booleanToFlowbiteBoolean(this.isIconOnly()),
187201
isPill: booleanToFlowbiteBoolean(this.isPill()),
188202
link: this.flowbiteRouterLink?.routerLink.urlTree ?? null,
203+
standardThemeConfig: this.standardThemeConfig(),
189204
customStyle: this.customStyle(),
190205
});
191206
}

libs/flowbite-angular/badge/badge.theme.service.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { BadgeClass, BadgeProperties, BadgeTheme } from './badge.theme';
22

33
import type { FlowbiteThemeService } from 'flowbite-angular';
4-
import { mergeTheme } from 'flowbite-angular/utils';
4+
import { fetchStandardTheme, mergeTheme } from 'flowbite-angular/utils';
55

66
import { inject, Injectable, InjectionToken } from '@angular/core';
77
import { twMerge } from 'tailwind-merge';
@@ -30,7 +30,7 @@ export class BadgeThemeService implements FlowbiteThemeService<BadgeProperties>
3030
const output: BadgeClass = {
3131
rootClass: twMerge(
3232
theme.root.base,
33-
theme.root.color[properties.color],
33+
fetchStandardTheme(properties.standardThemeConfig, theme.root.color[properties.color]),
3434
theme.root.hasBorder[properties.hasBorder],
3535
theme.root.size[properties.size],
3636
theme.root.isPill[
@@ -41,7 +41,13 @@ export class BadgeThemeService implements FlowbiteThemeService<BadgeProperties>
4141
theme.root.isIconOnly[properties.isIconOnly],
4242
theme.root.link[properties.link ? 'enabled' : 'disabled']
4343
),
44-
closeButtonClass: twMerge(theme.closeButton.base, theme.closeButton.color[properties.color]),
44+
closeButtonClass: twMerge(
45+
theme.closeButton.base,
46+
fetchStandardTheme(
47+
properties.standardThemeConfig,
48+
theme.closeButton.color[properties.color]
49+
)
50+
),
4551
};
4652

4753
return output;

libs/flowbite-angular/badge/badge.theme.ts

+186-27
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ import type {
22
DeepPartial,
33
FlowbiteBoolean,
44
FlowbiteClass,
5-
FlowbiteColors,
65
FlowbiteSizes,
6+
FlowbiteStandardColors,
77
RouterLinkParameter,
8+
StandardThemeConfiguration,
9+
StandardThemeInput,
810
} from 'flowbite-angular';
911
import { createTheme } from 'flowbite-angular/utils';
1012

@@ -14,10 +16,10 @@ import { createTheme } from 'flowbite-angular/utils';
1416
*/
1517
export interface BadgeColors
1618
extends Pick<
17-
FlowbiteColors,
19+
FlowbiteStandardColors,
1820
'primary' | 'dark' | 'blue' | 'red' | 'green' | 'yellow' | 'indigo' | 'purple' | 'pink'
1921
> {
20-
[key: string]: string;
22+
[key: string]: StandardThemeConfiguration;
2123
}
2224

2325
/**
@@ -38,6 +40,7 @@ export interface BadgeProperties {
3840
isIconOnly: keyof FlowbiteBoolean;
3941
isPill: keyof FlowbiteBoolean;
4042
link: RouterLinkParameter;
43+
standardThemeConfig: StandardThemeInput;
4144
customStyle: DeepPartial<BadgeTheme>;
4245
}
4346

@@ -67,20 +70,96 @@ export const badgeTheme: BadgeTheme = createTheme({
6770
root: {
6871
base: 'flex h-fit items-center gap-1 font-semibold',
6972
color: {
70-
primary:
71-
'bg-primary-100 dark:bg-primary-700 text-primary-800 dark:text-primary-300 group-hover:bg-primary-200 dark:group-hover:bg-primary-600 border-primary-300 dark:border-primary-800',
72-
dark: 'bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-300 group-hover:bg-gray-200 dark:group-hover:bg-gray-600 border-gray-300 dark:border-gray-600',
73-
blue: 'bg-blue-100 dark:bg-blue-200 text-blue-800 dark:text-blue-800 group-hover:bg-blue-200 dark:group-hover:bg-blue-300 border-blue-300 dark:border-blue-800',
74-
red: 'bg-red-100 dark:bg-red-200 text-red-800 dark:text-red-900 group-hover:bg-red-200 dark:group-hover:bg-red-300 border-red-300 dark:border-red-800',
75-
green:
76-
'bg-green-100 dark:bg-green-200 text-green-800 dark:text-green-900 group-hover:bg-green-200 dark:group-hover:bg-green-300 border-green-300 dark:border-green-800',
77-
yellow:
78-
'bg-yellow-100 dark:bg-yellow-200 text-yellow-800 dark:text-yellow-900 group-hover:bg-yellow-200 dark:group-hover:bg-yellow-300 border-yellow-300 dark:border-yellow-800',
79-
indigo:
80-
'bg-indigo-100 dark:bg-indigo-200 text-indigo-800 dark:text-indigo-900 group-hover:bg-indigo-200 dark:group-hover:bg-indigo-300 border-indigo-300 dark:border-indigo-800',
81-
purple:
82-
'bg-purple-100 dark:bg-purple-200 text-purple-800 dark:text-purple-900 group-hover:bg-purple-200 dark:group-hover:bg-purple-300 border-purple-300 dark:border-purple-800',
83-
pink: 'bg-pink-100 dark:bg-pink-200 text-pink-800 dark:text-pink-900 group-hover:bg-pink-200 dark:group-hover:bg-pink-300 border-pink-300 dark:border-pink-800',
73+
primary: {
74+
base: {
75+
light: 'bg-primary-100 text-primary-800 border-primary-300',
76+
dark: 'dark:bg-primary-700 dark:text-primary-300 dark:border-primary-800',
77+
},
78+
hover: {
79+
light: 'group-hover:bg-primary-200',
80+
dark: 'dark:group-hover:bg-primary-600',
81+
},
82+
},
83+
dark: {
84+
base: {
85+
light: 'bg-gray-100 text-gray-800 border-gray-300',
86+
dark: 'dark:bg-gray-700 dark:text-gray-300 dark:border-gray-600',
87+
},
88+
hover: {
89+
light: 'group-hover:bg-gray-200',
90+
dark: 'dark:group-hover:bg-gray-600',
91+
},
92+
},
93+
blue: {
94+
base: {
95+
light: 'bg-blue-100 text-blue-800 border-blue-300',
96+
dark: 'dark:bg-blue-200 dark:text-blue-800 dark:border-blue-800',
97+
},
98+
hover: {
99+
light: 'group-hover:bg-blue-200',
100+
dark: 'dark:group-hover:bg-blue-300',
101+
},
102+
},
103+
red: {
104+
base: {
105+
light: 'bg-red-100 text-red-800 border-red-300',
106+
dark: 'dark:bg-red-200 dark:text-red-900 dark:border-red-800',
107+
},
108+
hover: {
109+
light: 'group-hover:bg-red-200',
110+
dark: 'dark:group-hover:bg-red-300',
111+
},
112+
},
113+
green: {
114+
base: {
115+
light: 'bg-green-100 text-green-800 border-green-300',
116+
dark: 'dark:bg-green-200 dark:text-green-900 dark:border-green-800',
117+
},
118+
hover: {
119+
light: 'group-hover:bg-green-200',
120+
dark: 'dark:group-hover:bg-green-300',
121+
},
122+
},
123+
yellow: {
124+
base: {
125+
light: 'bg-yellow-100 text-yellow-800 border-yellow-300',
126+
dark: 'dark:bg-yellow-200 dark:text-yellow-900 dark:border-yellow-800',
127+
},
128+
hover: {
129+
light: 'group-hover:bg-yellow-200',
130+
dark: 'dark:group-hover:bg-yellow-300',
131+
},
132+
},
133+
indigo: {
134+
base: {
135+
light: 'bg-indigo-100 text-indigo-800 border-indigo-300',
136+
dark: 'dark:bg-indigo-200 dark:text-indigo-900 dark:border-indigo-800',
137+
},
138+
hover: {
139+
light: 'group-hover:bg-indigo-200',
140+
dark: 'dark:group-hover:bg-indigo-300',
141+
},
142+
},
143+
purple: {
144+
base: {
145+
light: 'bg-purple-100 text-purple-800 border-purple-300',
146+
dark: 'dark:bg-purple-200 dark:text-purple-900 dark:border-purple-800',
147+
},
148+
hover: {
149+
light: 'group-hover:bg-purple-200',
150+
dark: 'dark:group-hover:bg-purple-300',
151+
},
152+
},
153+
pink: {
154+
base: {
155+
light: 'bg-pink-100 text-pink-800 border-pink-300',
156+
dark: 'dark:bg-pink-200 dark:text-pink-900 dark:border-pink-800',
157+
},
158+
hover: {
159+
light: 'group-hover:bg-pink-200',
160+
dark: 'dark:group-hover:bg-pink-300',
161+
},
162+
},
84163
},
85164
hasBorder: {
86165
enabled: 'border',
@@ -106,16 +185,96 @@ export const badgeTheme: BadgeTheme = createTheme({
106185
closeButton: {
107186
base: 'ms-1 inline-flex items-center rounded-sm p-1 focus:ring-2',
108187
color: {
109-
primary:
110-
'text-primary-500 dark:text-primary-600 hover:bg-primary-200 dark:hover:bg-primary-300',
111-
dark: 'text-gray-500 dark:text-gray-600 hover:bg-gray-200 dark:hover:bg-gray-300',
112-
blue: 'text-blue-500 dark:text-blue-600 hover:bg-blue-200 dark:hover:bg-blue-300',
113-
red: 'text-red-500 dark:text-red-600 hover:bg-red-200 dark:hover:bg-red-300',
114-
green: 'text-green-500 dark:text-green-600 hover:bg-green-200 dark:hover:bg-green-300',
115-
yellow: 'text-yellow-500 dark:text-yellow-600 hover:bg-yellow-200 dark:hover:bg-yellow-300',
116-
indigo: 'text-indigo-500 dark:text-indigo-600 hover:bg-indigo-200 dark:hover:bg-indigo-300',
117-
purple: 'text-purple-500 dark:text-purple-600 hover:bg-purple-200 dark:hover:bg-purple-300',
118-
pink: 'text-pink-500 dark:text-pink-600 hover:bg-pink-200 dark:hover:bg-pink-300',
188+
primary: {
189+
base: {
190+
light: 'text-primary-500',
191+
dark: 'dark:text-primary-600',
192+
},
193+
hover: {
194+
light: 'hover:bg-primary-200',
195+
dark: 'dark:hover:bg-primary-300',
196+
},
197+
},
198+
dark: {
199+
base: {
200+
light: 'text-gray-500',
201+
dark: 'dark:text-gray-600',
202+
},
203+
hover: {
204+
light: 'hover:bg-gray-200',
205+
dark: 'dark:hover:bg-gray-300',
206+
},
207+
},
208+
blue: {
209+
base: {
210+
light: 'text-blue-500',
211+
dark: 'dark:text-blue-600',
212+
},
213+
hover: {
214+
light: 'hover:bg-blue-200',
215+
dark: 'dark:hover:bg-blue-300',
216+
},
217+
},
218+
red: {
219+
base: {
220+
light: 'text-red-500',
221+
dark: 'dark:text-red-600',
222+
},
223+
hover: {
224+
light: 'hover:bg-red-200',
225+
dark: 'dark:hover:bg-red-300',
226+
},
227+
},
228+
green: {
229+
base: {
230+
light: 'text-green-500',
231+
dark: 'dark:text-green-600',
232+
},
233+
hover: {
234+
light: 'hover:bg-green-200',
235+
dark: 'dark:hover:bg-green-300',
236+
},
237+
},
238+
yellow: {
239+
base: {
240+
light: 'text-yellow-500',
241+
dark: 'dark:text-yellow-600',
242+
},
243+
hover: {
244+
light: 'hover:bg-yellow-200',
245+
dark: 'dark:hover:bg-yellow-300',
246+
},
247+
},
248+
indigo: {
249+
base: {
250+
light: 'text-indigo-500',
251+
dark: 'dark:text-indigo-600',
252+
},
253+
hover: {
254+
light: 'hover:bg-indigo-200',
255+
dark: 'dark:hover:bg-indigo-300',
256+
},
257+
},
258+
purple: {
259+
base: {
260+
light: 'text-purple-500',
261+
dark: 'dark:text-purple-600',
262+
},
263+
hover: {
264+
light: 'hover:bg-purple-200',
265+
dark: 'dark:hover:bg-purple-300',
266+
},
267+
},
268+
pink: {
269+
base: {
270+
light: 'text-pink-500',
271+
dark: 'dark:text-pink-600',
272+
},
273+
hover: {
274+
light: 'hover:bg-pink-200',
275+
dark: 'dark:hover:bg-pink-300',
276+
},
277+
},
119278
},
120279
},
121280
});

0 commit comments

Comments
 (0)