11<template >
2- <div class =" t -relative" >
2+ <div class =" tw -relative" >
33 <slot
44 v-bind =" {
55 toogleShow,
6- data,
6+ data
77 }"
8- name =" input" >
8+ name =" input"
9+ >
910 <button
10- @click.prevent.stop =" show = !show"
11- class =" t-flex t-w-full t-justify-between t-items-center t-py-2 t-px-3 t-ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset focus:ring-primary-400" >
12- <span >{{ data?.label || data?.value || "" }} </span >
11+ class =" tw-flex tw-w-full tw-justify-between tw-items-center
12+ tw-py-2 tw-px-3 tw-ring-1 tw-ring-inset tw-ring-gray-300 tw-rounded-lg
13+ focus:tw-ring-2 focus:tw-ring-inset focus:tw-ring-primary-400"
14+ @click.prevent.stop =" toogleShow"
15+ >
16+ <span >{{ data?.label || data?.value }} </span >
1317
1418 <i class =" fas fa-chevron-down" />
1519 </button >
1822 <transition :name =" animation" >
1923 <div
2024 v-if =" show"
21- : class =" 'bg-' + color + '-500' "
22- class = " block mt-1 rounded absolute z-10 shadow-lg w-full bg-white " >
23- <ul class =" list-none overflow-hidden rounded" >
24- <li
25- v-for = " (option, index) in optionsModel "
26- :key = " index "
27- class = " hover:bg-gray-200 "
28- :class = " {
29- 'bg-gray-300': option?.value === data?.value,
25+ class =" tw-block tw-mt-1 tw-rounded-lg tw-absolute tw-z-10 tw-shadow-lg tw-bg-white tw-ring-1 tw-ring-inset tw-ring-gray-300 "
26+ >
27+ <ul class =" tw- list-none tw- overflow-hidden tw- rounded" >
28+ <slot
29+ name = " options "
30+ v-bind = " {
31+ options: optionsModel,
32+ data,
33+ onClick
3034 }"
31- @click.prevent.stop =" onClick(option, index)" >
32- <slot
33- name =" option"
34- v-bind =" {
35- option,
36- }" >
37- <span
38- class =" flex py-2 px-4 transition duration-300"
39- :class =" 'theme-' + color"
40- >{{ option.label || option.value }}</span
35+ >
36+ <li
37+ v-for =" (option, index ) in optionsModel"
38+ :key =" index"
39+ class =" hover:tw-bg-gray-200"
40+ @click.prevent.stop =" onClick(option, index)"
41+ >
42+ <slot
43+ name =" option"
44+ v-bind =" {
45+ option,
46+ data
47+ }"
4148 >
42- </slot >
43- </li >
49+ <span
50+ :class =" {
51+ 'tw-bg-gray-300': option?.value === data?.value
52+ }"
53+ class =" tw-flex tw-py-2 tw-px-4 transition duration-300"
54+ >{{ option.label || option.value }}</span >
55+ </slot >
56+ </li >
57+ </slot >
4458 </ul >
4559 </div >
4660 </transition >
4963
5064<script >
5165import {
52- defineComponent ,
53- ref ,
54- computed ,
55- onMounted ,
56- onUnmounted ,
66+ defineComponent , ref , computed , onMounted , onUnmounted ,
5767} from " vue" ;
5868
69+ /**
70+ * <Dropdown
71+ * animation="fade"
72+ * :options='{"label":"Label 1" , "value": "1"}'
73+ * :value="model"
74+ * />
75+ *
76+ * slot::input -> dropdown button
77+ * slot:option -> Custom component dropdown option
78+ */
79+
5980export default defineComponent ({
6081 props: {
61- color: {
62- type: String ,
63- default : () => " blue" ,
64- },
6582 animation: {
6683 type: String ,
6784 default : () => " fade" ,
@@ -71,22 +88,21 @@ export default defineComponent({
7188 type: Array ,
7289 default : () => [],
7390 },
74- modelValue : {
91+ value : {
7592 type: Object ,
7693 default : () => null ,
7794 },
7895 },
79- emits: [" update:modelValue " , " change" ],
96+ emits: [" input " , " change" ],
8097 setup (props , { emit }) {
8198 const show = ref (false );
82- const count = ref (0 );
8399
84100 const data = computed ({
85101 get () {
86- return props .modelValue ;
102+ return props .value ;
87103 },
88104 set (value ) {
89- emit (" update:modelValue " , value);
105+ emit (" input " , value);
90106 },
91107 });
92108
@@ -126,7 +142,6 @@ export default defineComponent({
126142 show,
127143 data,
128144 optionsModel,
129- count,
130145 onClick,
131146 toogleShow,
132147 };
@@ -136,71 +151,59 @@ export default defineComponent({
136151
137152<style scoped>
138153/* Animations */
139- .fade-enter-active ,
140- .fade-leave-active {
141- transition : opacity 0.1s ;
154+ .fade-enter-active , .fade-leave-active {
155+ transition : opacity .1s ;
142156}
143- .fade-enter ,
144- .fade-leave-to {
157+ .fade-enter , .fade-leave-to {
145158 opacity : 0 ;
146159}
147160
148161/* Slide-in-up animation*/
149- .slide-in-up-enter-active ,
150- .slide-in-up-leave-active {
151- transition : all 0.5s ;
162+ .slide-in-up-enter-active , .slide-in-up-leave-active {
163+ transition : all .5s ;
152164 transform : translateY (0 );
153165}
154- .slide-in-up-enter ,
155- .slide-in-up-leave-to {
166+ .slide-in-up-enter , .slide-in-up-leave-to {
156167 opacity : 0 ;
157168 transform : translateY (20px );
158169}
159170
160171/* Slide-in-right animation*/
161- .slide-in-right-enter-active ,
162- .slide-in-right-leave-active {
163- transition : all 0.5s ;
172+ .slide-in-right-enter-active , .slide-in-right-leave-active {
173+ transition : all .5s ;
164174 transform : translateX (0 );
165175}
166- .slide-in-right-enter ,
167- .slide-in-right-leave-to {
176+ .slide-in-right-enter , .slide-in-right-leave-to {
168177 opacity : 0 ;
169178 transform : translateX (20px );
170179}
171180
172181/* Slide-in-left animation*/
173- .slide-in-left-enter-active ,
174- .slide-in-left-leave-active {
175- transition : all 0.5s ;
182+ .slide-in-left-enter-active , .slide-in-left-leave-active {
183+ transition : all .5s ;
176184 transform : translateX (0 );
177185}
178- .slide-in-left-enter ,
179- .slide-in-left-leave-to {
186+ .slide-in-left-enter , .slide-in-left-leave-to {
180187 opacity : 0 ;
181188 transform : translateX (-20px );
182189}
183190
184191/* Scale animation*/
185- .scale-enter-active ,
186- .scale-leave-active {
187- transition : all 0.5s ;
192+ .scale-enter-active , .scale-leave-active {
193+ transition : all .5s ;
188194 transform : scale (1 );
189195}
190- .scale-enter ,
191- .scale-leave-to {
196+ .scale-enter , .scale-leave-to {
192197 opacity : 0 ;
193198 transform : scale (0 );
194199}
195200
196201/* Rotate animation*/
197- .rotate-enter-active ,
198- .rotate-leave-active {
199- transition : all 0.5s ;
202+ .rotate-enter-active , .rotate-leave-active {
203+ transition : all .5s ;
200204 transform : scale (1 ) rotate (-360deg );
201205}
202- .rotate-enter ,
203- .rotate-leave-to {
206+ .rotate-enter , .rotate-leave-to {
204207 opacity : 0 ;
205208 transform : scale (0 ) rotate (360deg );
206209}
0 commit comments