1
1
import { ComponentProps , FunctionComponent } from "react" ;
2
2
import { IconProps } from "../Icons/IconProps" ;
3
- import { Label , LocalizedString , IconButton , IconClose } from ".." ;
4
- import { Box , Columns , Column , BentoSprinkles } from "../internal" ;
5
- import { chipRecipe } from "./Chip.css" ;
3
+ import { Label , LocalizedString , IconButton , BoxProps , BoxType } from ".." ;
4
+ import { IconClose } from "../Icons/IconClose" ;
5
+ import { Column , Columns , BentoSprinkles , bentoSprinkles } from "../internal" ;
6
+ import { chip } from "./Chip.css" ;
6
7
import { useDefaultMessages } from "../util/useDefaultMessages" ;
7
8
8
9
type DismissProps =
@@ -15,51 +16,64 @@ type DismissProps =
15
16
onDismiss ?: never ;
16
17
} ;
17
18
18
- export type ChipProps = {
19
+ type DefaultColor =
20
+ | "grey"
21
+ | "red"
22
+ | "orange"
23
+ | "yellow"
24
+ | "green"
25
+ | "jade"
26
+ | "blue"
27
+ | "indigo"
28
+ | "violet"
29
+ | "pink" ;
30
+
31
+ export type ChipProps < CustomColor extends string > = {
19
32
label : LocalizedString ;
20
- color :
21
- | "grey"
22
- | "red"
23
- | "orange"
24
- | "yellow"
25
- | "green"
26
- | "jade"
27
- | "blue"
28
- | "indigo"
29
- | "violet"
30
- | "pink" ;
33
+ color : DefaultColor | CustomColor ;
31
34
} & DismissProps ;
32
35
33
- type ChipConfig = {
36
+ type ChipConfig < AtomsFn extends typeof bentoSprinkles , CustomColor extends string > = {
34
37
paddingX : BentoSprinkles [ "paddingX" ] ;
35
38
paddingY : BentoSprinkles [ "paddingY" ] ;
36
39
labelSize : ComponentProps < typeof Label > [ "size" ] ;
37
40
closeIcon : FunctionComponent < IconProps > ;
38
41
closeIconSize : IconProps [ "size" ] ;
39
42
internalSpacing : BentoSprinkles [ "gap" ] ;
43
+ customColors : {
44
+ [ k in CustomColor ] : BoxProps < AtomsFn > [ "background" ] ;
45
+ } ;
46
+ } ;
47
+
48
+ const defaultColorsMapping : Record < DefaultColor , BentoSprinkles [ "background" ] > = {
49
+ grey : "softGrey" ,
50
+ red : "softRed" ,
51
+ orange : "softOrange" ,
52
+ yellow : "softYellow" ,
53
+ green : "softGreen" ,
54
+ jade : "softJade" ,
55
+ blue : "softBlue" ,
56
+ indigo : "softIndigo" ,
57
+ violet : "softViolet" ,
58
+ pink : "softPink" ,
40
59
} ;
41
60
42
- export function createChip (
43
- config : ChipConfig = {
44
- paddingX : 8 ,
45
- paddingY : 4 ,
46
- labelSize : "small" ,
47
- closeIcon : IconClose ,
48
- closeIconSize : 8 ,
49
- internalSpacing : 8 ,
50
- }
61
+ export function createChip < AtomsFn extends typeof bentoSprinkles , CustomColors extends string > (
62
+ Box : BoxType < AtomsFn > ,
63
+ config : ChipConfig < AtomsFn , CustomColors >
51
64
) {
52
- return function Chip ( { color, label, ...dismissProps } : ChipProps ) {
65
+ const colorsMapping = { ...defaultColorsMapping , ...config . customColors } ;
66
+
67
+ return function Chip ( { color, label, ...dismissProps } : ChipProps < CustomColors > ) {
53
68
const { defaultMessages } = useDefaultMessages ( ) ;
54
69
55
70
return (
56
71
< Box display = "flex" >
57
72
< Box
58
73
paddingX = { config . paddingX }
59
74
paddingY = { config . paddingY }
60
- className = { chipRecipe ( {
61
- color,
62
- } ) }
75
+ className = { chip }
76
+ background = { colorsMapping [ color ] }
63
77
>
64
78
< Columns space = { config . internalSpacing } align = "center" alignY = "center" >
65
79
< Label size = { config . labelSize } > { label } </ Label >
@@ -79,3 +93,13 @@ export function createChip(
79
93
) ;
80
94
} ;
81
95
}
96
+
97
+ export const defaultChipConfig : ChipConfig < typeof bentoSprinkles , string > = {
98
+ paddingX : 8 ,
99
+ paddingY : 4 ,
100
+ labelSize : "small" ,
101
+ closeIcon : IconClose ,
102
+ closeIconSize : 8 ,
103
+ internalSpacing : 8 ,
104
+ customColors : { } ,
105
+ } ;
0 commit comments