@@ -19,6 +19,7 @@ type Props = {
1919 label ?: string ;
2020 name ?: string ;
2121 theme ?: COHERE_BRANDED_COLORS ;
22+ showCheckedState ?: boolean ;
2223 className ?: string ;
2324} ;
2425
@@ -30,8 +31,30 @@ export const Switch: React.FC<Props> = ({
3031 tooltip,
3132 theme = 'evolved-green' ,
3233 name,
34+ showCheckedState = false ,
3335 className = '' ,
3436} ) => {
37+ const themeColors : Partial < Record < COHERE_BRANDED_COLORS , string > > = {
38+ blue : 'bg-blue-500 group-hover:bg-blue-400' ,
39+ 'evolved-green' : 'bg-evolved-green-700 group-hover:bg-evolved-green-500' ,
40+ quartz : 'bg-quartz-500 group-hover:bg-quartz-400' ,
41+ green : 'bg-green-250 group-hover:bg-green-200' ,
42+ mushroom : 'bg-mushroom-600 group-hover:bg-mushroom-500' ,
43+ coral : 'bg-coral-600 group-hover:bg-coral-500' ,
44+ 'evolved-blue' : 'bg-evolved-blue-500 group-hover:bg-blue-400' ,
45+ 'evolved-mushroom' : 'bg-evolved-mushroom-500 group-hover:bg-evolved-mushroom-600' ,
46+ 'evolved-quartz' : 'bg-evolved-quartz-500 group-hover:bg-evolved-quartz-700' ,
47+ } ;
48+
49+ const checkedColor = checked
50+ ? themeColors [ theme ]
51+ : 'bg-mushroom-900 hover:bg-mushroom-800 dark:bg-volcanic-500 dark:group-hover:bg-volcanic-400' ;
52+
53+ const toggleTextClassNames = cn (
54+ 'pointer-events-none absolute' ,
55+ 'pt-0.5 font-variable text-[6px] font-medium uppercase' ,
56+ 'transform transition-all duration-300 ease-in-out'
57+ ) ;
3558 return (
3659 < div className = "group flex w-10 items-center" >
3760 < Field >
@@ -47,34 +70,41 @@ export const Switch: React.FC<Props> = ({
4770 checked = { checked }
4871 onChange = { onChange }
4972 className = { cn (
50- 'relative inline-flex h-5 w-10 shrink-0 cursor-pointer rounded border-2 border-transparent' ,
73+ 'relative inline-flex h-4 w-[30px] shrink-0 cursor-pointer rounded border-2 border-transparent' ,
5174 'transition-colors duration-300 ease-in-out' ,
5275 'focus-visible:outline focus-visible:outline-offset-4 focus-visible:outline-volcanic-500' ,
53- {
54- 'bg-mushroom-900 hover:bg-mushroom-800 dark:bg-volcanic-500 dark:group-hover:bg-volcanic-400' :
55- ! checked ,
56- 'bg-blue-500 group-hover:bg-blue-400' : checked && theme === 'blue' ,
57- 'bg-evolved-green-700 group-hover:bg-evolved-green-500' :
58- checked && theme === 'evolved-green' ,
59- 'bg-quartz-500 group-hover:bg-quartz-400' : checked && theme === 'quartz' ,
60- 'bg-green-250 group-hover:bg-green-200' : checked && theme === 'green' ,
61- 'bg-mushroom-600 group-hover:bg-mushroom-500' : checked && theme === 'mushroom' ,
62- 'bg-coral-600 group-hover:bg-coral-500' : checked && theme === 'coral' ,
63- 'bg-evolved-blue-500 group-hover:bg-blue-400' : checked && theme === 'evolved-blue' ,
64- 'bg-evolved-mushroom-500 group-hover:bg-evolved-mushroom-600' :
65- checked && theme === 'evolved-mushroom' ,
66- 'bg-evolved-quartz-500 group-hover:bg-evolved-quartz-700' :
67- checked && theme === 'evolved-quartz' ,
68- }
76+ checkedColor
6977 ) }
7078 >
79+ { showCheckedState && (
80+ < >
81+ < Text
82+ aria-hidden = "true"
83+ className = { cn ( toggleTextClassNames , {
84+ 'translate-x-[3px] opacity-100' : checked ,
85+ 'translate-x-[14px] opacity-0' : ! checked ,
86+ } ) }
87+ >
88+ On
89+ </ Text >
90+ < Text
91+ aria-hidden = "true"
92+ className = { cn ( toggleTextClassNames , 'text-mushroom-700 dark:text-volcanic-800' , {
93+ 'translate-x-[14px] opacity-100' : ! checked ,
94+ 'translate-x-0 opacity-0' : checked ,
95+ } ) }
96+ >
97+ Off
98+ </ Text >
99+ </ >
100+ ) }
71101 < span
72102 aria-hidden = "true"
73103 className = { cn (
74- 'pointer-events-none inline-block h-4 w-5 rounded shadow-lg' ,
104+ 'pointer-events-none absolute h-3 w-3 rounded shadow-lg' ,
75105 'transform transition-all duration-300 ease-in-out' ,
76106 {
77- 'translate-x-4 ' : checked ,
107+ 'translate-x-[14px] ' : checked ,
78108 'translate-x-0' : ! checked ,
79109 'bg-mushroom-700 dark:bg-volcanic-800' : ! checked ,
80110 'bg-marble-950' : checked ,
0 commit comments