22import Card from '@/showcase/ui-group/Card'
33import { motion , AnimatePresence } from 'framer-motion'
44import { Check , Copy } from 'lucide-react'
5- import { useState } from 'react'
65import { toast } from 'sonner'
76import { HexColorPicker } from "react-colorful" ;
8- import { Popover } from '@headlessui/react'
7+ import { Fragment , useState } from 'react'
8+ import { Listbox , Popover , Transition } from '@headlessui/react'
9+
10+ const people = [
11+ { name : 'Wade Cooper' } ,
12+ { name : 'Arlene Mccoy' } ,
13+ { name : 'Devon Webb' } ,
14+ { name : 'Tom Cook' } ,
15+ { name : 'Tanya Fox' } ,
16+ { name : 'Hellen Schmidt' } ,
17+ ]
918
1019const CustomGradientGenerator = ( ) => {
1120 const [ copied , setCopied ] = useState ( false )
1221 const [ fromColor , setFromColor ] = useState ( "#aabbcc" ) ;
1322 const [ viaColor , setViaColor ] = useState ( "#aabbcc" ) ;
1423 const [ toColor , setToColor ] = useState ( "#ddeeff" ) ;
15- let gradient = `radial-gradient(circle, ${ fromColor } ,${ viaColor } ,${ toColor } )` ;
24+ const [ selected , setSelected ] = useState ( people [ 0 ] )
25+ let gradient = `radial-gradient(circle at top left, ${ fromColor } ,${ viaColor } ,${ toColor } )` ;
1626
1727 const copyGradient = ( ) => {
1828 navigator . clipboard . writeText ( gradient )
@@ -65,11 +75,13 @@ const CustomGradientGenerator = () => {
6575 </ button >
6676 </ div >
6777
68- < div className = "flex items-start justify-between px-5 pt-2 gap-3 rounded-xl border border-white ring-1 ring-zinc-200 transition-all ease-in-out hover:cursor-pointer dark:border-transparent dark:ring-zinc-700" >
69- < Popover className = "relative " >
78+ < div className = "flex flex-col items-start justify-start px-5 pt-2 gap-3 rounded-xl border border-white ring-1 ring-zinc-200 transition-all ease-in-out hover:cursor-pointer dark:border-transparent dark:ring-zinc-700 " >
79+ < div className = 'flex items-center w-full mx-auto justify-center gap-3
80+ ' >
81+ < Popover className = "relative " >
7082 < Popover . Button className = "p-2 border-2 dark:border-zinc-800 border-zinc-200 flex items-center gap-2 justify-between rounded-lg" >
7183 < span > From</ span >
72- < div className = 'h-5 w-5' style = { { backgroundColor : fromColor } } > </ div >
84+ < div className = 'h-5 w-5' style = { { backgroundColor : fromColor } } > </ div > < span className = 'hidden md:block' > { fromColor } </ span >
7385 </ Popover . Button >
7486
7587
@@ -82,7 +94,7 @@ const CustomGradientGenerator = () => {
8294
8395 < Popover . Button className = "p-2 border-2 dark:border-zinc-800 border-zinc-200 flex items-center gap-2 justify-between rounded-lg" >
8496 < span > Via</ span >
85- < div className = 'h-5 w-5' style = { { backgroundColor : viaColor } } > </ div >
97+ < div className = 'h-5 w-5' style = { { backgroundColor : viaColor } } > </ div > < span className = 'hidden md:block' > { viaColor } </ span >
8698 </ Popover . Button >
8799
88100
@@ -95,14 +107,63 @@ const CustomGradientGenerator = () => {
95107
96108 < Popover . Button className = "p-2 border-2 dark:border-zinc-800 border-zinc-200 flex items-center gap-2 justify-between rounded-lg" >
97109 < span > To</ span >
98- < div className = 'h-5 w-5' style = { { backgroundColor : toColor } } > </ div >
110+ < div className = 'h-5 w-5' style = { { backgroundColor : toColor } } > </ div > < span className = 'hidden md:block' > { toColor } </ span >
99111 </ Popover . Button >
100112
101113
102114 < Popover . Panel className = "absolute z-10 right-0" >
103115 < HexColorPicker color = { toColor } onChange = { setToColor } />
104116 </ Popover . Panel >
105117 </ Popover >
118+ </ div >
119+ < div className = "w-full px-6 py-3" >
120+ < Listbox value = { selected } onChange = { setSelected } >
121+ < div className = "relative mt-1" >
122+ < Listbox . Button className = "relative w-full cursor-default rounded-lg bg-white py-2 pl-3 pr-10 text-left shadow-md focus:outline-none focus-visible:border-indigo-500 focus-visible:ring-2 focus-visible:ring-white/75 focus-visible:ring-offset-2 focus-visible:ring-offset-orange-300 sm:text-sm" >
123+ < span className = "block truncate" > { selected . name } </ span >
124+
125+ </ Listbox . Button >
126+ < Transition
127+ as = { Fragment }
128+ leave = "transition ease-in duration-100"
129+ leaveFrom = "opacity-100"
130+ leaveTo = "opacity-0"
131+ >
132+ < Listbox . Options className = "absolute mt-1 max-h-60 w-full overflow-auto rounded-md z-30 bg-white py-1 text-base shadow-lg ring-1 ring-black/5 focus:outline-none sm:text-sm" >
133+ { people . map ( ( person , personIdx ) => (
134+ < Listbox . Option
135+ key = { personIdx }
136+ className = { ( { active } ) =>
137+ `relative cursor-default select-none z-30 py-2 pl-10 pr-4 ${
138+ active ? 'bg-amber-100 text-amber-900' : 'text-gray-900'
139+ } `
140+ }
141+ value = { person }
142+ >
143+ { ( { selected } ) => (
144+ < >
145+ < span
146+ className = { `block truncate ${
147+ selected ? 'font-medium' : 'font-normal'
148+ } `}
149+ >
150+ { person . name }
151+ </ span >
152+ { selected ? (
153+ < span className = "absolute inset-y-0 left-0 flex items-center pl-3 text-amber-600" >
154+ Wow
155+ </ span >
156+ ) : null }
157+ </ >
158+ ) }
159+ </ Listbox . Option >
160+ ) ) }
161+ </ Listbox . Options >
162+ </ Transition >
163+ </ div >
164+ </ Listbox >
165+ </ div >
166+
106167 </ div >
107168 </ div >
108169 ) ;
0 commit comments